gpt4 book ai didi

javascript - 使 Backbone.js 模型更改 "partially"无声?

转载 作者:数据小太阳 更新时间:2023-10-29 05:36:51 25 4
gpt4 key购买 nike

当我的“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);

我如何提醒这个模型发生变化而不是前一个(以避免反馈循环)?

更新:
现在,我决定为每个 set 调用生成一个特定的 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 仍然相同,我知道可能存在反馈循环的风险。

最佳答案

迟到总比不到好..

最简单的方法是使用标志。例如,在 globalModel 中设置某些内容时,您还可以更改模型上的属性以指示您已经更改了某些内容。然后,您可以在 updateChartModel 中验证此标志的值。例如:

chartModel.bind("改变", updateGlobalModel);

function updateGlobalModel() {
if (!flag) {
globalModel.set(obj);
flag = true;
}
}

可能与您最终使用 setID 所做的非常相似。顺便说一句,下划线有一个 uniqueId内置功能。<​​/p>

您可以做的另一件事是在您的 sets 调用中传递一个选项。

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)
}
}

在您的第三个(和其他模型)中,您可以放弃此检查。

最后的选择当然是查看您的设计。如果这两个模型密切相关以至于它们必须彼此保持同步,那么合并它们的功能也许是有意义的。或者,您可以将通用功能拆分出来。这在很大程度上取决于您的具体情况。

关于javascript - 使 Backbone.js 模型更改 "partially"无声?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8581647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com