2014-06-14 3 views
0

전역 함수 (페이지의 스크립트 태그에 정의 된 함수)에 액세스하는 이벤트 핸들러가 내 페이지에 있습니다. 예를 들어 :RequireJS and Globals

cleartb() 함수는 단순히 페이지에 앉아 그건
<button id="ClearText" onclick="cleartb()">Clear Text Box</button> 

: 이제

<script> 
function cleartb() 
{ 
    vm.essayText(''); 
    return; 
} 
</script> 

는, VM 내 페이지의 뷰 모델이다 (그러나 중요한이 질문에 모든 것이 단순히 있었다이다 전체 페이지에서 사용할 수있는 전역 변수) 및 여러 이벤트 처리기, 경고 메시지 등에서 노출하는 함수와 값을 사용합니다.

문제는 VM의 정의를 RequireJS AMD 모듈 .js :

define(["knockout", "jquery"], function (ko, $) { 

    var essayText = 'Hello World!'; 

    ... 

    return { 
    essayText: essayText 
    } 
}); 

내 onlick 이벤트 핸들러가 실행되거나 어떤 방식 으로든 vm을 참조 할 때 예상대로 "VM undefined"오류가 발생합니다.

질문 1 :

어떻게 내가 전역 네임 스페이스를 "오염"하지 않으 특히 AMD의 모듈에 정의 된 VM 변수에 내 페이지 액세스 권한을 부여 할 수 있습니까? 여기에 최선의 방법이 있습니까?

질문 2 : 그것은 정말보기 모델 별 동작하기 때문에 궁극적으로

, 나는 심지어 페이지 cleartb()를 원하지 않는다. 질문 1에 대한 답변을 얻었다면 무엇을해야 할지를 생각할 수 있다고 생각하지만, cleatb 기능을 VM 모듈로 옮겨서 AMD 모듈로 옮기는 것이 가장 좋습니다. onlick 이벤트 핸들러.

vm.cleartb()를 계속 사용하거나 vm.essayText() (KO 관찰 가능) 값을 검사 할 수 있도록 vm 변수에서 여전히 값과 함수를 노출하고 싶습니다. (즉, cleartb (VM) 솔루션으로 문제를 해결하고 싶지 않습니다.)

도움 주셔서 감사합니다!

답변

0
<script> 
function cleartb() 
{ 
    vm.essayText(''); 
    return; 
} 
alert(window.cleartb); 
</script> 

실제로이 방법은 이미 글로벌 변수 window을 오염시키고 있습니다. 그래서 당신의 첫 번째 요구 사항은 이해가 안된다고 생각합니다. 그리고 당신은이 방법을 수행 할 수 있습니다

define(["knockout", "jquery"], function (ko, $) { 

    var essayText = 'Hello World!', varToBeExported; 

    ... 
    window.varToBeExported = { 
    'cleartb': cleartb 
}; 
    return { 
    essayText: essayText 
    } 
}); 

그러나 불필요한 경우, 당신은 requireJs 방식으로 사용한다

- require(['your moudle'],....합니다.

+0

내 질문 1에 대한 포인트가 유효합니다. 이미 내 명시된 목표를 사용하여 글로벌 네임 스페이스를 "오염"시키고 있습니다. 그러나 그것은 저를 생각하게합니다 : Require() 호출을 사용하여 그러한 오염을 피하는 방법은 어디에서나 전역 var를 사용할 것입니다. 예를 들어, 내 버튼의 onclick 이벤트 핸들러는 다음과 같아야합니까? - '' – Jazimov

+0

죄송합니다, 당신의 예제에서'varToBeExported'가 어떻게 export되는지 알지 못합니다. – Jazimov

+0

죄송합니다. 나는 창 아래에'varToBeExported' 선언하는 것을 잊는다. 나는 그것을 고쳤다. 이 문제를 해결할 다른 방법이 있는지 나는 모른다. 한 영웅이 함께합시다. :-) – tjfdfs