【问题标题】:How to break circular dependency in knockout model subscriber?如何打破淘汰模型订阅者的循环依赖?
【发布时间】:2015-07-17 19:15:21
【问题描述】:

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

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

如何解决这种循环依赖?

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

UPD:重点是使用setTimeout

【问题讨论】:

    标签: knockout.js circular-dependency


    【解决方案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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您应该将 onStateChanged 函数订阅到每个子模型的 isLoading observable,而不是父模型的 isLoading observable。

      self.submodels().forEach(function (submodel) {
          submodel.isLoading.subscribe(onStateChanged);
      });
      

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

      【讨论】:

      • 不知道为什么这种方法比我的更好?子模型可以动态添加,并且潜在的父模型可能有很多子模型(20-30)。
      • 如果将 onStateChanged 传递给子模型,则子模型可以在创建时进行订阅,从而解决您的动态问题。我相信这种方法的意图很明确,因为它不需要任何变通方法。
      猜你喜欢
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 2015-01-29
      • 2016-01-27
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多