2013-07-11 37 views
3

确定我有像在此PIC的布局:事件视图之间处理

MessageListView

Layout

在屏幕的上部的表通过由

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; 
}); 

MessageView

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的引用吗?
  • 在选择方法内触发事件,并在预览视图中使用()进行监听。
  • 在我的模型中使用瞬态“选定”属性,并使PreviewView收听“更改”事件?

谢谢,如果你需要更多的细节请告诉我,我会编辑的问题。

回答

6

不确定最佳实践,但我发现这个解决方案并不重要。我创建了一个全球性的消息对象,公交车,不管:

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); 
+0

确定,但怎么样传递所选模型。 PreviewView如何知道集合上的哪个模型被选中?也许我可以将模型本身传递给事件总线? –

+0

当然,触发器也接受参数:App.vent.trigger('PreviewView。show',model); –

+0

在您看来,保持应用程序视图(顶层一)不知道底层视图正在做什么,并使用事件聚合器,因为您建议保持所有视图解耦....是更好还是让集合和所有东西应用程序视图? –