我有一个像 -
这样的骨干模型ModelA = Backbone.Model.extend({
this.set("prop1",true);
})
和视图一样 -
ViewA = Backbone.View.extend({
initialize : function(){
this.listenTo(this.model,"change:prop1",this.changeProp1)l;
this.model.set("prop1",true);
},
changeProp1 : function(){
// callback doesn't call because I'm setting the same value
}
});
var model1 = new ModelA();
var view1 = new ViewA({model:model1});
这里回调changeProp1会在prop1从更改时触发 - > false - >真的。 但每当我设置相同的值或不同的值时,我都想听。
答案 0 :(得分:2)
我说最好单独离开change
事件,并实施新的set
事件(或任何你想要的事件)。毕竟,您希望收到有关严格更改的事项的通知。
您可以在模型中实现自己的set()
版本,该版本会触发自定义的“{1}}”。事件,然后调用骨干常用的设置方法。
var MyModel = Backbone.Model.extend({
set: function(key, val, options) {
// Deal with single name/value or object being passed in
var changes;
if (typeof key === 'object') {
changes = key;
options = val;
} else {
(changes = {})[key] = val;
}
options || (options = {});
// Trigger 'set' event on each property passed in
for (var i = 0, l = changes.length; i < l; i++) {
this.trigger('set:' + changes[i], this, this.attributes[changes[i]], options);
}
// Call the usual backbone 'set' method
Backbone.Model.prototype.set.apply(this, arguments);
}
});
然后聆听您的新活动,而不是(或更改)&#39;更改&#39;,在适当情况下:
ViewA = Backbone.View.extend({
initialize : function(){
this.listenTo(this.model,"set:prop1",this.changeProp1)l;
this.model.set("prop1",true);
},
但是,大部分代码都是从Backbone的默认set
方法中解除的,并没有处理其他一些问题,例如某些选项标记和嵌套事件。如果您想更改Backbone源本身,您要查找的行是:
if (!_.isEqual(current[attr], val)) changes.push(attr);
(版本1.0.0中的第347行)并尝试删除if
子句。
(上面的代码未经过测试,对于任何语法错误感到抱歉)
答案 1 :(得分:0)
为了实现上述功能,您必须在backbone.js中对change函数进行更改。如果是,则更改检查属性的值是否更改,而不仅仅是它调用绑定的函数。