我有一个集合,我正在收听所有模型更改事件。在一个特定的模型属性中,我需要在模型上设置一个额外的值,这会导致再次触发事件。我试图传递自定义选项,所以我可以忽略第二个调用。我不想使用{ silent: true }
,因为我需要用户界面进行更新。
问题是我的自定义选项正在通过。我发现原因是因为更改事件在当前模型的change事件中被触发,所以它只是在骨干代码中继续它,并且我的自定义选项没有被传入。
这就是我正在做的事情。这是粗略的代码,仅用于示例目的,而不是精确的。
var View = Backbone.View.extend({
initialize: function(){
this.collection = new Backbone.Collection();
this.listenTo(this.collection, "change", this._modelChange);
},
_modelChange: function(model, options)
{
if(!_.has(model.changed, "IsSelected")){
model.set({ Selected: true }, { modelChanging: true });
}
// Do some other things...
}
});
这里发生的事情是我需要订阅发生的任何变更事件,并在事件发生时执行某些操作。有10多个属性,所以我不想列出所有属性。如果更改的属性不是IsSelected
,我需要将其设置为true
。这将导致change
事件再次触发,并且将再次调用_modelChange
方法。这是我期待{ modelChanging: true }
选项可用的地方,但它不是。我发现这种情况正在发生,因为它在更改事件期间设置了模型的价值,因此骨干网将触发事件本身,骨干网不知道我传入的选项
这是我提出的一个解决方案,但我真的不喜欢它。
setTimeout(function(){
model.set({ Selected: true }, { modelChanging: true });
}, 0);
这将以异步方式运行,因此它将不再是同一事件的一部分。我真的不喜欢这样,感觉就像是一个大黑客。
如何在没有setTimeout
的情况下完成此操作?