Joh*_*nny 8 javascript backbone.js
我有一个单页Web应用程序,其中包含多个backbone.js视图.这些观点有时必须相互沟通.两个例子:
为了尽可能地分离视图,我目前使用自定义事件来传递data($(document).trigger('customEvent', data)).有一个更好的方法吗?
jak*_*kee 14
一种广泛使用的技术是扩展Backbone.Events-object以创建您的个人全局事件聚合器.
var vent = {}; // or App.vent depending how you want to do this
_.extend(vent, Backbone.Events);
Run Code Online (Sandbox Code Playgroud)
根据您是否使用requirejs或其他内容,您可能希望将其分隔为自己的模块或将其作为Application对象的属性.现在,您可以在应用中的任何位置触发和收听事件.
// View1
vent.trigger('some_event', data1, data2, data3, ...);
// View2
vent.on('some_event', this.reaction_to_some_event);
Run Code Online (Sandbox Code Playgroud)
这也允许您使用事件聚合器在模型,集合,路由器等之间进行通信.这是Martin Fowler对事件聚合器的概念(不是在javascript中).这是一个更多的backboney实现,并在Backbone.Marionette的脉络中更多地反思这个主题,但大部分都适用于vanilla Backbone.
希望这有帮助!
我在第一部分同意@jakee
var vent = {};
_.extend(vent, Backbone.Events);
Run Code Online (Sandbox Code Playgroud)
但是,使用"on"监听全局事件可能会导致内存泄漏和僵尸视图问题,并且还会导致多个操作处理程序调用等.
您应该在视图中使用"listenTo"而不是"on"
this.listenTo(vent, "someEvent", yourHandlerFunction);
Run Code Online (Sandbox Code Playgroud)
因此,当您删除视图时view.remove(),此处理程序也将被删除,因为处理程序绑定到您的视图.
触发全局事件时,只需使用
vent.trigger("someEvent",parameters);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5564 次 |
| 最近记录: |