我正在触发一个自定义事件,但找不到从另一个文件将操作绑定到该事件的方法。我猜这是一个范围问题,但我无法单独解决它。
在我的应用入口文件中,我触发了一个自定义的boom
事件,如下所示:
var page_object_test = {};
_.extend(page_object_test, Parse.Events);
page_object_test.trigger("boom");
这段代码包含在一个jQuery $(document).ready()
语句中。
然后,从另一个文件中的jQuery插件heild中,并将其包含在(function($) {})(jQuery);
结构中,我想将某个函数绑定到我的boom
事件,但什么也没发生:
var page_object = {
update_page_title : function(route, params) {
var new_title = "";
switch(route) {
default:
new_title = "La meilleure façon d'emmener vos enfants à l'école";
}
document.title.html(new_title);
}
};
_.extend(page_object, Parse.Events);
page_object.on("boom", function() {console.log(".on() binding is working!")});
为什么我不能从另一个文件接收这个事件?我意识到我不明白 Backbone.js 事件是如何冒出来的。除了正确的写作方式,我真的很想被指出对这些事件的范围的清晰解释。
欢迎任何解释
2条答案
按热度按时间osh3o9ms1#
您的范围有问题:
page_object_test
必须在您希望它侦听的另一个文件中已知。对于 Backbone.js 事件,不存在事件冒泡这样的事情。
四种解决方案:
1.全局变量
1.通过连续的参数传递
1.使用AMD
1 -全局变量:
全局变量被认为是危险的,但却是在全局范围内进行交流的唯一方式,需要谨慎地操纵它们。
例如:具有1个存储整个应用程序状态的全局对象:
2 - DOM元素:
如果你的事件实际上与一个DOM元素相关,这就更有意义了。
3 -作为参数传递
这就将问题转移到了
generate_listener
的通信上,因此没有赢得太多。1.使用AMD
最后,看看AMD,它的设计是为了模块化你的应用程序,正如你所期望的那样(基本上,它为你处理全局变量的事情,确保你不会在错误的情况下使用它)。
ih99xse12#
你有没有考虑过 puppet ?
https://github.com/marionettejs/backbone.wreqr
默认情况下,它在 puppet 中使用,但也可以在外部单独使用。
否则,您可以使用Backbone.Events,如Backbone文档中所述
假设 object 在全局范围内可用,则可以订阅并触发其上的事件。