【问题标题】:Event handling between views视图之间的事件处理
【发布时间】:2013-07-11 08:58:08
【问题描述】:

好的,我有一个像这张图片中的布局:

屏幕上方的表格由:

消息列表视图

define(['backbone','collections/messages','views/message'], function(Backbone, MessageCollection, MessageView) {
    var MessageListView = Backbone.View.extend({
        el: '#messagesContainer', 
        initialize: function() {

            this.collection = new MessageCollection();
            this.collection.fetch({reset:true});
            this.listenTo( this.collection, 'reset', this.render );

            this.table = this.$el.find("table tbody");
            this.render();
        },
        render: function() {
            this.collection.each( function(message, index) {                
                this.renderMessage(message, index);
            }, this);
        },
        renderMessage: function(message, index) {
            var view = new MessageView({
                model:message,
                className: (index % 2 == 0) ? "even" : "odd"    
            });
            this.table.append( view.render().el );
        }
    });
    return MessageListView;
});

消息视图

define(['backbone','models/message'], function(Backbone, MessageCollection, MessageView) {
    var MessageView = Backbone.View.extend({
        template: _.template( $("#messageTemplate").html() ), 
        render: function() {
            this.setElement( this.template(this.model.toJSON()) );          
            return this;
        },
        events:{
            'click':'select'
        },
        select: function() {
           // WHAT TO DO HERE?
        }
    });
    return MessageView;
});

AppView

define(['backbone','views/messages'], function(Backbone, MessageList) {
    var App = Backbone.View.extend({
        initialize: function() {
            new MessageList(); 
        }
    });
    return App;
});

我很快会在屏幕下方添加一个新视图(可能是“PreviewView”)。

当用户点击一行时,我想在“PreviewView”中发生一些事情。

例如,在 PreviewView 中显示其他模型的属性(例如细节)可能会很有趣。

最佳做法是什么?

  • 在每个 MessageView 中保存对 PreviewView 的引用?
  • 在 select 方法中触发事件,并在预览视图中使用 on() 监听它们。
  • 在我的模型中使用瞬态“选定”属性,并使 PreviewView 监听集合“更改”事件?

谢谢,如果您需要更多详细信息,请告诉我,我会编辑问题。

【问题讨论】:

    标签: backbone.js backbone-views backbone-events


    【解决方案1】:

    不确定最佳实践,但我发现此解决方案实施起来很简单。我创建了一个全局消息传递对象、总线等:

    window.App = {};
    window.App.vent = _.extend({}, Backbone.Events);
    

    您必须在之前创建的事件总线上注册 PreviewView 的“可触发”功能(根据您的示例,这应该在 PreviewView 中):

    initialize: function () {
        App.vent.on('PreviewView.show', this.show, this);
    }
    

    现在您应该能够通过调用:App.vent.trigger 从应用程序中的任何位置触发任何已注册的事件。例如,当用户点击一行时,您会看到类似的内容:

    App.vent.trigger('PreviewView.show');
    

    如果您必须与触发的事件一起发送和反对,请使用:

    App.vent.trigger('PreviewView.show', data);
    

    【讨论】:

    • 好的,但是如何将它传递给选定的模型。 PreviewView 如何知道选择了集合上的哪个模型?也许我可以在事件总线上传递模型本身?
    • 当然,触发器也接受参数:App.vent.trigger('PreviewView.show', model);
    • 在您看来,最好让应用程序视图(顶级一级)不知道底层视图在做什么,并按照您的建议使用事件聚合器来保持所有视图解耦......或者在应用程序视图中有集合和所有东西?
    • 我总是使用解耦视图,但这真的取决于你,耦合和解耦都有其优点和缺点。在解耦视图的情况下,您可以获得可读性,但如果出现一般错误,您可能必须在每个视图中纠正相同的错误。最好的办法是尝试两种解决方案并坚持使用您最喜欢的一种。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多