【问题标题】:RequireJS and GlobalsRequireJS 和 Globals
【发布时间】:2014-08-04 21:09:06
【问题描述】:

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

<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 时,我收到“vm undefined”错误(如预期的那样)。

问题一:

如何让我的页面访问 AMD 模块中定义的 vm 变量,尤其是在我不想“污染”全局命名空间的情况下?这里有最佳实践吗?

问题 2:

最终,我什至不想在页面上显示 cleartb(),因为它确实是特定于视图模型的操作。尽管我认为一旦获得问题 1 的(一个?)答案,我就可以弄清楚该怎么做,但我很想知道如何最好地将 cleartb 函数移动到 vm AMD 模块中,以便我仍然可以从我的onlick 事件处理程序。

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

感谢您的帮助!

【问题讨论】:

    标签: requirejs global-variables require js-amd


    【解决方案1】:
    <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'],....

    【讨论】:

    • 关于我的问题 1 的观点有效——我已经用我的既定目标“污染”了全局命名空间。但这让我想:避免这种污染的方法是在我可能使用全局变量的任何地方使用 Require() 调用吗?例如,我的按钮的 onclick 事件处理程序应该像这样吗?-- &lt;button id="ClearText" onclick="Require(["vm"],function(vm){vm.cleartb();});"&gt;Clear Text Box&lt;/button&gt;
    • 抱歉,我看不到 varToBeExported 在您的示例中是如何导出的。
    • 对不起。我忘记在窗口下声明varToBeExported。我已经修好了。我不知道是否有其他方法可以解决这个问题。让我们一起期待一位英雄。 :-)
    • 我正在考虑您的建议——这是我在自己努力解决此问题时考虑过的。然而,有一个很大的整体问题,它与 RequireJS 的异步性有关。即使我们将 varToBeExported 作为窗口/全局变量公开给主页,事实是当页面引用它时,它可能对页面的其余部分不可用。想象一下,在 RequireJS 异步处理 vm 模块之前,有人点击了按钮……我能否确保在处理页面上的
    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多