Backbone JS:可以在其他视图中触发更新吗?
在我的简单项目中,我有2个视图 - 订单项视图(品牌)和应用。 我附加了允许选择多个项目的功能:
var BrandView = Backbone.View.extend({ ...some code... toggle_select: function() { this.model.selected = !this.model.selected; if(this.model.selected) $(this.el).addClass('selected'); else $(this.el).removeClass('selected'); return this; } }); var AppView = Backbone.View.extend({ ...some code... delete_selected: function() { _.each(Brands.selected(), function(model){ model.delete_selected(); }); return false; }, });
事情是,我想知道选择了多少项目。 在此设置中,选择不会影响模型,因此不会触发任何事件。 从MVC的概念我明白,意见不应该直接与其他意见交谈。 那么AppView如何知道在BrandViews中选择了什么?
更具体地说,我AppView知道有多少项目被选中,所以如果选择了多个项目,我会显示一个用于多项选择的菜单。
您可能需要阅读关于Backbone pub / sub事件的讨论:
http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/
我喜欢将其作为全局事件机制添加进来:
Backbone.pubSub = _.extend({}, Backbone.Events);
然后在一个视图中,您可以触发一个事件:
Backbone.pubSub.trigger('my-event', payload);
而在另一个你可以听:
Backbone.pubSub.on('my-event', this.onMyEvent, this);
我使用Addy Osmani所谓的中介模式http://addyosmani.com/largescalejavascript/#mediatorpattern。 整篇文章非常值得一读。
基本上它是一个活动管理器,允许你订阅和发布活动。 所以你的AppView会下标到一个事件,即'选择'。 然后,BrandView将发布“选定”事件。
我喜欢它的原因是它允许您在视图之间发送事件,而不会将视图直接绑定在一起。
例如
var mediator = new Mediator(); //LOOK AT THE LINK FOR IMPLEMENTATION
var BrandView = Backbone.View.extend({
toggle_select: function() {
...
mediator.publish('selected', any, data, you, want);
return this;
}
});
var AppView = Backbone.View.extend({
initialize: function() {
mediator.subscribe('selected', this.delete_selected)
},
delete_selected: function(any, data, you, want) {
... do something ...
},
});
通过这种方式,您的应用视图不关心它是发布“选定”事件的BrandView或FooView,而只是发生该事件。 因此,我发现它是一种可管理的方式来管理你的应用程序之间的事件,而不仅仅是视图。
如果你进一步阅读'Facade',你可以创建一个很好的权限结构。 这可以让你说只有一个'AppView'可以订阅我的'selected'事件。 我觉得这很有帮助,因为它可以清楚地说明事件的使用场合。
忽略你在文章中已经提到的问题,你可以绑定和触发全局Backbone.Event对象的事件,这将允许任何事情与其他任何事情交谈。 绝对不是最好的解决方案,如果你有意见聊天,那么你应该考虑重构。 但是,你去! 希望这可以帮助。
链接地址: http://www.djcxy.com/p/63095.html上一篇: Backbone JS: can one view trigger updates in other views?