Backbone.js:视图之间的通信

时间:2011-09-20 13:09:02

标签: views backbone.js

我正在开发一个包含条目列表的Backbone应用程序,很像示例应用程序Todos(http://documentcloud.github.com/backbone/examples/todos/index.html)。

因此,我有一个App视图和每个列表项一个视图。现在,假设我有一个全局编辑按钮。应用程序视图将处理单击,然后我想要做的是告诉每个列表视图显示删除按钮。

在下面的屏幕截图中(来自Spotify),按“编辑”按钮会导致所有列表视图更改外观。

使用Backbone执行此操作的最佳方法是什么?我需要迭代所有列表视图并调用editMode函数。但App视图(开箱即用)不知道列表视图..

enter image description here

2 个答案:

答案 0 :(得分:41)

我在一段时间内撰写了一篇文章,讨论了一些用于协调观点的不同选项:http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/

在您的情况下,我建议使用我在该文章中描述的事件聚合器。您可以让每个项目视图侦听“editmode”事件或类似事件。当此事件触发时,每个侦听它的视图都会自动更新以进入编辑模式。当你点击“完成” - 发送一个“viewmode”事件或类似事件时,你会做相反的事情,并让每个视图都适当地更新。

答案 1 :(得分:2)

我的两分钱:你可以用backbone.js做一个简单的“hack”,实际上有一个可以在视图之间进行通信的pub / sub:

这些方面的东西(未经测试):

var EventBus = Backbone.Model.extend({

   publish: function(event, args){

       this.trigger(event, args);

   },

   subscribe: function(event, args) {

       this.bind(event, args);

   }
});

你基本上可以理解。现在对于每个视图,让它“绑定”到这个EventBus(因为视图只能绑定到主干中的模型/集合) - 你基本上只是使用方法名称publish / subscribe与这种模型的命名法同步但你可以选择不。在这种情况下,只需创建一个空EventBus'类',并将每个视图绑定到它:)

因此,每个视图只需要与此EventBus耦合,并对收到的事件采取行动! Backbone.js在内部处理这个设计模式的所有管道,所以你几乎可以免费获得它:)

上面的代码可能不会按原样运行,但可以让您了解它......