如何打破淘汰模型订户的循环依赖?

时间:2015-07-16 17:35:12

标签: knockout.js circular-dependency

我正在使用Knockout构建模型。我有一个父模型和几个孩子。每个孩子在工作代码中都有obsevrablecomputed,但它不会改变情况)isLoading当模型中的任何内部操作被处理时返回true

父模型还计算了具有订阅者的isLoading。在这个订阅者中,我只想执行一些代码(我有特殊的标志,没关系)。我的问题是这个代码以某种方式改变了一个孩子的isLoading状态。在那里我发现它不会引发父计算机改变。

如何区分这种循环依赖?

示例小提琴:http://jsfiddle.net/202x4755/

UPD :关键是使用setTimeout

2 个答案:

答案 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);
});

http://jsfiddle.net/Crimson/202x4755/1/