我正在使用Knockout构建模型。我有一个父模型和几个孩子。每个孩子在工作代码中都有obsevrable
(computed
,但它不会改变情况)isLoading
当模型中的任何内部操作被处理时返回true
。
父模型还计算了具有订阅者的isLoading
。在这个订阅者中,我只想执行一些代码(我有特殊的标志,没关系)。我的问题是这个代码以某种方式改变了一个孩子的isLoading
状态。在那里我发现它不会引发父计算机改变。
如何区分这种循环依赖?
示例小提琴:http://jsfiddle.net/202x4755/
UPD :关键是使用setTimeout
答案 0 :(得分:1)
您可以使循环更新异步。因为你总是有通知,你应该确保在开始之前更新是必要的,否则你将进入一个永久的更新循环。
对于这个例子,你的订阅应该(仅)在submodels()[1]上,但是我们假设你还有其他事情要求它在父模型上。
function onStateChanged(value) {
console.log('onStateChanged ' + value);
// If second model finished loading automatically mark last model as loaded also
if (!self.submodels()[1].isLoading() && self.submodels()[2].isLoading()) {
setTimeout(function () {
console.debug("Forcing submodel isloading to false");
self.submodels()[2].isLoading(false);
}, 0);
}
}
答案 1 :(得分:0)
您应该将onStateChanged
函数订阅到每个子模型的isLoading
可观察对象而不是父对象isLoading
可观察对象。
self.submodels().forEach(function (submodel) {
submodel.isLoading.subscribe(onStateChanged);
});