Backbone.js:总是检测模型何时有属性集,而不是/只是/更改
Backbone.js: Always detect when a model has an attribute set, not /just/ changed
在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)没有注册为"更改"事件。但这意味着我的"摇晃"课程不会被应用,这很糟糕。
如何使Backbone始终识别何时设置了属性,即使我设置的值相同?是否存在某种"设置"事件?(在文档中没有看到。)
编辑:我知道可能有一种{silent:true}/.trigger()破解方法可以实现这一点,但有没有任何"干净"或"语义"的方法可以始终识别.set()调用?
我认为你的设计是错误的。视图不应该选择一个随机数并告诉模型这是它的新值,视图应该告诉模型汇总一个新数字。然后你可以在你的模型中有这个:
roll: function() {
this.set('lastRoll', getRandomInteger(1, 6), { silent: true });
this.trigger('change:lastRoll', this, this.get('lastRoll'));
}
而您的视图只是CCD_ 1。是的,你仍然会做{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
方法是向外部世界隐藏所有这些欺诈行为的一种方便方法。
相关文章:
- 调整屏幕大小时更改属性值
- 在第二次选择中选择2更改属性
- 如何使用jquery更改属性
- YUI3模块在构建后更改属性
- 使用 Javascript 在一列中更改属性内容
- KineticJS在对象创建(NOOB)后更改属性
- Javascript:如何在不使用getElementById的情况下更改子元素的获取和更改属性
- 如何在sails.js中更改属性模型中的日期格式
- 为什么backbone.js model.save()会更改属性hash
- 按权重过滤节点并更改属性
- 使用 Jquery 更改属性状态
- CreateJS:吐温JS时间轴补间多次更改属性而不链接
- 更改属性时重新渲染 Angular2 组件
- 用效果更改属性
- 更改属性时不触发$watch的对象
- 更改属性 Javascript 方式的值
- 如何在不更改属性数据类型的情况下推送对象数组
- 使用 Javascript 根据现有值更改属性值
- 根据当前属性值更改属性字符串
- 在单击角度时更改属性