如何使用RequireJS进行跨模块回调/事件处理
How do I go about cross-module callback/event handling with RequireJS
我很喜欢RequireJS,终于在Javascript中实现了一些模块化/封装,但在将回调传递给另一个模块时遇到了障碍。
具体来说,我已经为我的应用程序创建了一个菜单模块。它可以由另一个模块加载,您可以使用所述菜单模块中的公开功能添加菜单。
现在,这个菜单项可以有处理程序,例如表单提交或点击。此外,回调通常会访问调用模块中私人/内部定义的函数,即使用菜单函数的函数。
我试过:
- 在将事件传递给菜单函数之前将其绑定到元素,但这并不起作用
- 将回调函数作为第二个参数传递,并将其绑定到菜单模块中
这两种方法都不起作用。
有什么想法吗?
有关更多详细信息的一些代码
菜单模块功能
function addMenuItem(jqObj, evtHandler) {
console.log("Adding menu " + jqObj);
jqObj.click(evtHandler);
menuList.append($("<li>").append(jqObj));
}
使用模块调用菜单中的功能
function addSelectionMenuItem() {
satInput = $("<input type=search placeholder='search' />");
menuModule.addMenuItem(satInput, function() {
this.loadCzml(satInput.val());
console.log("Checking execution...");
});
}
谢谢!
我怀疑this
是否是事件处理程序中所需的值。将您的呼叫更改为addMenuItem
,使其显示为:
var self = this;
menuModule.addMenuItem(satInput, function() {
self.loadCzml(satInput.val());
console.log("Checking execution...");
});
我在调用之前向self
添加了一个赋值,并在回调中使用self
而不是this
。jQuery文档关于这个的价值:
当jQuery调用处理程序时,
this
关键字是对传递事件的元素的引用;对于直接绑定的事件,这是附加事件的元素,而对于委托事件,这则是与selector
匹配的元素。
使用.bind()更改事件处理程序的上下文
jqObj.click(evtHandler.bind(this);
好吧,这毕竟不是回调的模块化作用域问题。
菜单模块中使用的插件使用jquery克隆方法克隆html元素。但是,它没有将参数传递给clone方法,因此它默认不克隆任何处理程序。
这意味着调用模块传递的输入不再是页面上可见的,克隆的版本没有处理程序!
至少这个插件是开源的,所以我可以看到代码。
无论如何都要感谢:)
相关文章:
- 带有全局变量、咖啡脚本和回调的模块 CSV
- 如何使用RequireJS进行跨模块回调/事件处理
- 使用其他模块中的函数,避免异步回调地狱
- NodeJS异步模块:如何在回调中获取results对象
- 无法在模块中执行回调,使用 Node-Cron导出对象
- 节点.JS请求模块回调未触发
- 模块模式内的回调函数中的“this”指的是什么
- 正在node.js中为所需模块创建回调
- npm异步模块未执行最终回调
- require.js-未定义的模块作为参数传递以定义回调
- 使用异步模块在读取所有文件后触发回调
- 如何执行我的回调函数是一个自定义Dojo模块
- 作为回调受害者的 JS 模块模式的公共方法.(本期)
- 导出模块中的Node js回调
- 理解模块.用回调导出
- Node.js:使用Bluebird将模块函数从回调转换为承诺
- 如何在 Node.js 模块中处理异步回调
- Nodejs异步编程——为什么有“async"模块需要吗?什么是“回调地狱”/“末日金字塔”
- 调用另一个模块函数作为回调[ES6]
- 模块模式回调实现