在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()调用?
答案 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
方法可以方便地将所有这些诡计隐藏在外部世界中。