Backbone.js:始终检测模型何时设置属性,而不是/只/更改

时间:2013-08-18 02:06:18

标签: javascript backbone.js backbone-events

在Backbone中,当我将Model的属性设置为之前的相同值时,“更改”事件不会触发。

我的观点:

initialize: function() {
  this.$lastRollResult = this.$el.find('#lastRollResult');
  this.listenTo(this.model, 'change:lastRoll', this.render);
},

render: function() {
  this.$lastRollResult
    .html(this.model.get('lastRoll'))
    .addClass('shaking');

  var self = this;
  setTimeout(function() {
    self.$lastRollResult.removeClass('shaking');
  }, 1000);
},

events: {
  'click #button': function() {
    this.model.set('lastRoll', getRandomInteger(1, 6));
  }
}

有时当我调用getRandomInteger()时,int将与前一个相同,导致我的.set('lastRoll',int)不能注册为“change”事件。但这意味着我的“摇动”课程将不适用,这很糟糕。

如果设置了属性,即使我设置的值相同,我怎样才能使Backbone 始终识别?有某种“定型”事件吗? (没有在文档中看到一个。)

编辑:我知道可能有一个{silent:true} / .trigger()hack来实现这一目标,但是有任何“干净”或“语义”的方式来处理识别.set()调用?

1 个答案:

答案 0 :(得分:3)

我认为你的设计是错误的。视图不应该选择一个随机数并告诉模型它的新值,该视图应告诉模型汇总一个新数字。然后你可以在你的模型中使用它:

roll: function() {
    this.set('lastRoll', getRandomInteger(1, 6), { silent: true });
    this.trigger('change:lastRoll', this, this.get('lastRoll'));
}

您的观点只是this.model.roll()。是的,您仍然在进行{silent:true}trigger黑客攻击,但至少它会在正确的位置。

当然,这可能会产生奇怪的副作用,所以你可以回到模型的后面,在设置一个新模型之前悄悄地取消设置值:

roll: function() {
    // I suppose you could quietly unset here if you feel bad
    // about fiddling with `attributes`.
    this.attributes.lastRoll = null;
    this.set('lastRoll', getRandomInteger(1, 6));
}

同样,在模型上使用单独的roll方法可以方便地将所有这些诡计隐藏在外部世界中。