骨干.发送/收听视图之间的事件

use*_*094 12 backbone.js backbone-events

我对如何处理Backbone中的视图之间的事件感到困惑.现在我在网站上同时呈现了两个部分视图.现在我希望其中一个视图调度另一个视图可以侦听的事件.我该怎么做?

在调度我运行的事件的视图中:

this.trigger("myEvent")
Run Code Online (Sandbox Code Playgroud)

在视图中听我跑:

this.bind('myEvent', this.myFunc);
Run Code Online (Sandbox Code Playgroud)

但似乎没有任何事情发生.

mu *_*ort 26

如果您正在触发事件v1:

this.trigger('myEvent'); // this is v1
Run Code Online (Sandbox Code Playgroud)

然后你必须听从以下事件v1:

v1.on('myEvent', this.myFunc); // this is, say, v2 here.
Run Code Online (Sandbox Code Playgroud)

事件不是全局的,它们来自特定对象,如果要接收事件,则必须侦听这些特定对象.

如果你将视图直接绑定到彼此,你很快就会陷入混乱,一切都直接与其他一切联系在一起.通常的解决方案是创建自己的事件总线:

// Put this where ever it makes sense for your application, possibly
// a global, possible something your your app's global namespace, ...
var event_bus = _({}).extend(Backbone.Events);
Run Code Online (Sandbox Code Playgroud)

然后v1通过以下方式发送事件event_bus:

event_bus.trigger('myEvent');
Run Code Online (Sandbox Code Playgroud)

v2会听取event_bus:

this.listenTo(event_bus, 'myEvent', this.myFunc);
Run Code Online (Sandbox Code Playgroud)

我也从切换bindlistenTo,因为listenTo可以更容易地防止僵尸.

演示:http://jsfiddle.net/ambiguous/yb9TY/