假设你是一个音乐库的应用程序。
你有一个观点与流派列表,另一个显示所选择的类型的内容。 当用户点击列表中的流派,在其他视图中的内容应进行相应的更新。
是什么使有最小的相关做到这一点的最好方法是什么?
我还没有发现任何其他地方听的鼠标点击比绘制各个流派的观点。 我可以从那里发送一个事件,但什么是让该事件要更新的绘制风格内容的另一种观点的最佳方式是什么? 谁应该听那个事件,流派内容视图或它的收藏?
编辑:我实例从应用程序的路由器两种观点,我也设法让这种通过使景色知道对方的工作,但是这不是最佳的,当然。
你可以做一个简单的模型来保存应用程序的状态,你不需要任何幻想,只是数据包实现普通主干事件方法:
var AppState = Backbone.Model.extend({});
var app_state = new AppState();
然后流派列表视图会听click事件(因为你已经拥有),并设置当前类型的应用状态模型当有人改变它:
var Genres = Backbone.View.extend({
//...
choose: function(ev) {
// This would be the click handler for the genre,
// `.html()` is just for demonstration purposes, you'd
// probably use a data attribute in real life.
app_state.set({genre: $(ev.target).html() });
},
});
对各个流派的观点会听的"change:genre"
上的应用程序状态模型事件和流派的变化作出反应:
var Genre = Backbone.View.extend({
initialize: function() {
_.bindAll(this, 'change_genre');
app_state.on('change:genre', this.change_genre);
},
//...
change_genre: function() {
// Refill the genre display...
}
});
演示: http://jsfiddle.net/ambiguous/mwBKm/1/
你可以为你想和模型都是在骨干数据事件工作的一种便捷方式的任何数据让模特。 作为额外的奖励,这种做法使得它很容易,以保存应用程序的状态:只是增加普通主干持久性的支持,以AppState
和远离你去。
如果你只需要一个简单的事件总线围绕推动非数据事件,您可以使用骨干的Events
方法来构建一个简单的事件聚合:
app.events = _.extend({}, Backbone.Events);
然后,假设你有一个全球性app
的命名空间,你可以说这样的事情:
app.events.on('some-event', some_function);
和
app.events.trigger('some-event', arg1, arg2, ...);
我见过的最好的办法是在所提出的方法德里克贝利 。 总之,你可以创建一个事件聚合器,它提供了提高到不同的意见可以订阅事件集中的对象。 该解决方案的优点在于它是非常简单的实现,因为它利用骨干现有的事件系统。