Backbone自定义事件绑定的最佳位置&自定义事件触发器

时间:2013-02-15 13:29:57

标签: events backbone.js triggers bind

我在一个集合的bbone视图上触发了用户交互时触发的自定义事件,我希望在另一个不相关的视图上发出更改信号。为此我使用自定义事件。

//a global event object for my pub-sub model
var vent = Backbone.extend({}, Backbone.Event);

var C1 = Backbone.Collection.extend();
var V1 = Backbone.View.extend(
  events: {
    'click .appointment': 'clickCallback'
  },

  clickCallback: function(){
    vent.trigger('appointment:selected', apptProps);
  }
);

var c1Obj = new C1([{...}, {...}]);
var v1Obj = new V1({
  collection: c1Obj
});

因此,当用户点击集合视图v1Obj的.appointment元素时,这将宣布一个约会:所选事件。

现在我想要一个不同的视图V2来响应这个事件。哪里是绑定“预约:选定”活动的最佳地点?在视图V2(CASE 1)的initialize()中,还是V2(CASE 2)的集合/模型的initialize()或其他地方? 我试图澄清什么是最佳实践,如果有的话。

案例1:

var V2 = Backbone.View.extend(
  initialize: function(){
    vent.on('appointment:selected', this.apptSelected, this);
  },
  appSelected: function(apptProps){
    ...
  }
);

案例2:

var C2 = Backbone.Collection.extend(
  initialize: function(){
    vent.on('appointment:selected', this.apptSelected, this);
  },
  appSelected: function(apptProps){
    ...
  }
);

据我了解,Bbone在用户交互时的哲学是操纵数据而不是修改标记,这个想法是数据更改级联到视图。如果是这样,原始问题的答案是CASE 2?

1 个答案:

答案 0 :(得分:1)

我认为最惯用的事情是:

  • 通过包含在集合中来表示“已选择”的状态
  • 当用户点击.appointment时,view1会将约会模型添加到selectedAppointments集合
  • view2绑定selectedAppointments的正常集合生命周期事件(添加,删除,重置)并相应地重新呈现自身
  • 两个视图都将此集合放在initialize
  • 的选项参数中

请注意,从Backbone 0.9.9开始,Backbone对象本身可以用作应用程序范围的事件总线,而不是vent对象。