2

我正在使用requirejs将大量 .js 文件转换为 AMD 模块

我实现了关于返回函数的概念以及很多链接类,但是,我如何处理诸如以下的事件:

$('blah blah').onClick( ...

$('blah blah 2').onChange( ...

我是否只是创建一个不返回任何内容的模块?处理这类事情的最佳方法是什么?

4

2 回答 2

1

如果您只想执行一次,在应用程序初始化时,只需将其放在模块的主体中​​并且不返回任何内容:

define([...], function() {
  // All code here will be executed once at initialization.
});

只要您导入该模块,所有主体代码都将执行一次。这对 jQuery 选择器来说是个坏主意,因为无法保证在评估时 DOM 会正确加载。

如果您需要手动调用代码一次或多次,请将其封装在一个对象中,您可以在需要时导入并调用它:

define([...], function() {
  return {
    registerEvents : function () {
      // All code here will be executed when `module.registerEvents()` is called.
    }
  };
});

这将是注册 DOM 事件的正确方法,因为它可以让您更好地控制何时评估它。

于 2013-07-09T23:50:48.800 回答
0

由于选择一个元素并使用 jQuery 选择器附加一个处理程序发生在整个文档上,因此从技术上讲,它可以放在任何地方。

我想说这在很大程度上取决于你如何组织你的模块。

如果您将它们拆分为 MV* 组件,交互处理程序将进入 V* 部分(例如 Backbone 视图)。

如果您正在使用其他一些组织方案,通常我会说将处理程序放在它们绑定最紧密的地方。例如,如果一个模块已经引用了您要绑定到的 DOM 元素,则将处理程序与它一起放入(并使用该特定引用,而不是调用$()遍历文档,可能会拾取不需要的元素),以便您可以在元素生命周期结束时取消绑定处理程序。

于 2013-07-10T00:04:18.333 回答