当我的“chartModel”发生变化时,我想更新“globalModel”。
chartModel.bind("change", updateGlobalModel);
updateGlobalModel(){
globalModel.set(obj)
}
反之亦然,我希望我的chartModel在globalModel更改时更新。
globalModel.bind("change", updateChartModel);
updateChartModel(){
chartModel.set(obj)
}
这会在设置globalModel时产生反馈循环。我可以通过设置{silent:true}来阻止这种情况。
但问题出现了。我有另一个依赖于变更事件的模型:
globalModel.bind("change", updateOtherModel);
如何提醒此模型的变更但不提醒前者(以避免反馈循环)?
更新
现在,我决定为每个集合调用生成一个特定的ID:
set : function(attrs, options) {
if(!("setID" in attrs)){
attrs.setID = myApp.utils.uniqueID(); //newDate.getTime();
}
Backbone.Model.prototype.set.call(this, attrs, options);
},
这样,我总是可以在应用程序的任何位置生成“setID”属性。如果从模型中提取东西时setID仍然相同,我知道可能存在反馈循环的风险。
答案 0 :(得分:1)
迟到总比没好..
最简单的方法是使用标志。例如,在globalModel
中设置内容时,您还可以更改模型上的属性以指示您已更改某些内容。然后,您可以在updateChartModel
中验证此标志的值。例如:
chartModel.bind(“change”,updateGlobalModel);
function updateGlobalModel() {
if (!flag) {
globalModel.set(obj);
flag = true;
}
}
可能非常类似于您最终使用setID所做的事情。另外,下划线内置了uniqueId
函数。
你可以做的另一件事,就是更清洁,就是通过你的套装电话传递一个选项。
chartModel.set(obj, { notify : false });
是的,你可以传递你想要的任何选项,你不仅限于{ silent : true }
。有关详情,请参阅this discussion on github。然后,检查是否存在此属性,您可以在其中处理更改事件,如下所示:
function updateGlobalModel(model, options){
// explicitly check for false since it will otherwise be undefined and falsy
// you could reverse it.. but I find this simpler
if (options.notify !== false) {
globalModel.set(obj)
}
}
并且在您的第三个(和其他型号)中,您可以放弃此检查。
最后的选择当然是看你的设计。如果这两个模型密切相关,必须保持彼此同步,那么合并它们的功能可能是有意义的。或者,您可以拆分常用功能。这完全取决于您的具体情况。
答案 1 :(得分:0)
我的知识是有限的,所以也许我不应该回答,但我会尝试传递对chartModel的引用,当它被创建时引用你想要更新的“其他”模型。然后在updateChartModel()上触发一个事件,并确保你的“其他”模型绑定在该事件上。
我的问题是:静音对象是否将所有事件静音?或只是模型相关的?如果所有事件都被静音,这显然不会起作用。