我想知道在backbone中是否有专门触发的事件来区分backbone模型或集合中属性值的更改和属性的移除
发布于 2014-08-19 09:09:12
不,在模型属性上调用unset只会触发一个change event。如果你需要有一个不同的事件来挂钩,我建议向模型添加一个方法,包装一个未设置的调用并激发一个自定义事件:
var MyModel = Backbone.Model.extend({
removeAttribute: function (attr) {
this.unset('attr', { silent: true });
this.trigger('attributeRemoved');
}
});
var newModel = new MyModel({ first: 'foo', second: 'bar' });
newModel.removeAttribute('first');
发布于 2014-08-19 09:10:05
set
和unset
都将触发'change'
事件。来自Backbone文档:
在模型上设置属性的散列(一个或多个)。如果任何属性更改了模型的状态,将在模型上触发“更改”事件。还会触发特定属性的更改事件,您也可以绑定到这些属性,例如: change:title和change:content。您还可以将单个键和值传递给
通过从内部属性散列中删除属性来删除该属性。激发"change“事件,除非将silent作为选项传递。
如果你看一看backbone source code,你会看到以下关于unset的内容:
// Remove an attribute from the model, firing `"change"`. `unset` is a noop
// if the attribute doesn't exist.
unset: function(attr, options) {
return this.set(attr, void 0, _.extend({}, options, {unset: true}));
},
编辑
您可以创建自己的unset
函数来替换Backbone.Model中的现有函数,您可以在其中触发任何可能需要的新事件:
var FooModel = Backbone.Model.extend({
unset: function(attr, options) {
options || (options = {});
//Call unset in Backbone.Model, set silent option also if suppressChangeEvent was set
var silent = options.silent;
options.silent = silent || options.suppressChangeEvent;
var res = Backbone.Model.prototype.unset.apply(this, arguments);
//trigger unset events if not silent and the attribute was removed
if (attr == null || silent || !this.hasChanged(attr)) return res;
this.trigger('unset:' + attr, this, this._previousAttributes[attr], options);
this.trigger('unset', this, options);
return res;
}
});
我已经创建了this fiddle,这样您就可以看到这个想法的实际效果。如果您使用以下代码测试它:
var myModel = new FooModel({key1 : 1, key2: "foo", key3: "a"});
myModel.on("change", function(){ console.log("change triggered"); });
myModel.on("change:key1", function(){ console.log("change for key1 triggered"); });
myModel.on("change:key2", function(){ console.log("change for key2 triggered"); });
myModel.on("unset", function(){ console.log("unset triggered"); });
myModel.on("unset:key1", function(){ console.log("unset for key1 triggered"); });
myModel.on("unset:key2", function(){ console.log("unset for key2 triggered"); });
myModel.unset("key1");
myModel.unset("key2", {suppressChangeEvent: true});
myModel.unset("key3", {silent: true});
myModel.unset("key5");
您将在控制台中看到以下输出( key1触发的所有事件,仅为key2触发的未设置事件,如果静默或属性不存在,则为none ):
change for key1 triggered
change triggered
unset for key1 triggered
unset triggered
unset for key2 triggered
unset triggered
https://stackoverflow.com/questions/25379354
复制