1

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

我的观点:

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) 没有注册为“更改”事件。但这意味着我的“摇晃”课程不会被应用,这很糟糕。

即使我设置的值相同,如何让 Backbone在设置属性时始终识别?是否有某种“设置”事件?(在文档中没有看到。)

编辑:我知道可能有一个 {silent: true} / .trigger() hack 来完成此操作,但是是否有任何“干净”或“语义”的方式来始终识别 .set() 调用?

4

1 回答 1

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的方法是向外界隐藏所有这些诡计的便捷方法。

于 2013-08-18T02:58:10.610 回答