我的页面中有许多事件处理程序正在访问全局函数(页面上脚本标记中定义的函数)。例如:
<button id="ClearText" onclick="cleartb()">Clear Text Box</button>
该cleartb()函数只是位于页面上:
<script>
function cleartb()
{
vm.essayText('');
return;
}
</script>
现在,vm是我的页面视图模型(但对于这个问题,重要的是它只是一个可用于整个页面的全局变量)并且我使用它在几个事件处理程序中公开的函数和值,提醒信息等。
问题是我已经将vm的定义移到了名为vm.js的RequireJS AMD模块中:
define(["knockout", "jquery"], function (ko, $) {
var essayText = 'Hello World!';
...
return {
essayText: essayText
}
});
当我的onlick事件处理程序运行或我以任何方式引用vm时,我得到一个&#34; vm undefined&#34;错误(如预期的那样)。
如何让我的页面访问AMD模块中定义的vm变量,特别是如果我不想&#34;污染&#34;全局命名空间?这里有最好的做法吗?
最终,我甚至不想在页面上使用cleartb(),因为它确实是特定于视图模型的操作。虽然我想在得到问题1的答案后我可以弄明白该怎么做,但我很想知道如何最好地将cleartb函数移动到vm AMD模块中,这样我仍然可以从我的调用它onlick事件处理程序。
请注意,我希望仍然可以从vm变量中公开值和函数,以便我可以继续使用vm.cleartb()或检查vm.essayText()的值(它是一个可观察的KO)。 (换句话说,我不想用cleartb(vm)解决方案解决问题。)
感谢您的帮助!
答案 0 :(得分: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'],....
。