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?

下一篇: Backbone.js fire event on .remove()