javascript – 如何从Backbone.js中的集合中的另一个模型触发模型更新?

更新:这是我正在研究的项目的工作演示:http://www.newedenfaces.com

我有两个视图:PeopleView包含2个缩略图(集合)和PersonView – 每个缩略图本身(模型).

这基本上是一个Facemash克隆,你有两个并排的图像.如果一个人赢了比赛,另一个人输掉比赛.

为了更新wins count,这很简单,只需将其添加到PersonView:

// Model View
events: {
    'click img': 'winner'
},
winner: function() {
    this.model.set('wins', this.model.get('wins') + 1);
    this.model.save();
}

但是如何通过增加损失计数来更新其他模型?或者我应该在集合级别而不是在单个模型上执行此类逻辑?

更新

直到我找到一个优雅的解决方案,我已设法使用此hack解决此问题:

// Collection View
initialize: function() {
    this.collection.on('change:wins', this.updateLosses, this);
  },

  updateLosses: function(model) {
    var winnerIndex = this.collection.indexOf(model);
    var otherModel = this.collection.at(Math.abs(1 - winnerIndex));
    otherModel.set('losses', otherModel.get('losses') + 1);
    otherModel.save();
    this.render();
  },

我的PersonView仍然处理wins count的更新.但是,当更新wins count时,PeopleView集合视图将侦听事件.当发生这种情况时,它会采用该模型并获得其索引位置.由于我只有2个视图/ 2个模型,所以另一个模型必定是“失败者”.您可以通过Math.abs(1 – winnerIndex)获得其他模型的索引,并且您需要做的唯一事情就是更新其损失计数.

注意:我刚刚开始学习Backbone,所以这是我第一个使用它的项目.我真的希望有更好的方法来做到这一点.如果你知道,发表一个答案,我就可以接受并关闭这个问题了.

最佳答案
与@ pvnarula的答案类似,您可以使用Backbone的内置Event模块
创建一个模型视图绑定的事件调度程序.

// Define an event dispatcher/handler
var dispatcher = _.extend({}, Backbone.Events);

// Model View
initialize: {
    this.listenTo(dispatcher, 'game:over', this.updateCounts);
}

events: {
    'click img': 'winner'
},

winner: function() {
    // just trigger the custom event and let each view figure out how to respond.
    // also pass along the id of the winning model
    dispatcher.trigger('game:over', this.model.id)
},

updateCounts: function(winnerId) {
    if (this.model.id === winnerId) {
        this.model.set('wins', this.model.get('wins') + 1); 
    } else {
        this.model.set('losses', this.model.get('losses') + 1);
    }
    this.model.save();
}

另外值得查看本文以了解有关Backbone Events的更多信息:http://lostechies.com/derickbailey/2012/04/03/revisiting-the-backbone-event-aggregator-lessons-learned/

转载注明原文:javascript – 如何从Backbone.js中的集合中的另一个模型触发模型更新? - 代码日志