RequireJS和Globals

时间:2014-06-14 12:41:48

标签: requirejs global-variables require js-amd

我的页面中有许多事件处理程序正在访问全局函数(页面上脚本标记中定义的函数)。例如:

<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;错误(如预期的那样)。

问题1:

如何让我的页面访问AMD模块中定义的vm变量,特别是如果我不想&#34;污染&#34;全局命名空间?这里有最好的做法吗?

问题2:

最终,我甚至不想在页面上使用cleartb(),因为它确实是特定于视图模型的操作。虽然我想在得到问题1的答案后我可以弄明白该怎么做,但我很想知道如何最好地将cleartb函数移动到vm AMD模块中,这样我仍然可以从我的调用它onlick事件处理程序。

请注意,我希望仍然可以从vm变量中公开值和函数,以便我可以继续使用vm.cleartb()或检查vm.essayText()的值(它是一个可观察的KO)。 (换句话说,我不想用cleartb(vm)解决方案解决问题。)

感谢您的帮助!

1 个答案:

答案 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'],....