【问题标题】:Cyclic dependency using Knockout subscribe使用 Knockout 订阅的循环依赖
【发布时间】:2014-08-18 09:26:16
【问题描述】:

在我使用 Knockout.js 订阅时遇到循环依赖的以下代码是否有任何可能的修复方法。

this.observable1.subscribe(function(value){
self.observable2("someValue");
});

this.observable2.subscribe(function(value){
self.observable1("someValue");
});

其中“self”是“this”的别名,observable1 链接到组合框,observable2 链接到日期选择器。

请推荐

【问题讨论】:

  • 了解为什么组合框必须影响日期选择器,反之亦然,这可能有助于提供替代解决方案。你能提供这个推理吗?
  • 你想让他们两个同步吗?
  • @TrueEddie,是的。我正在尝试让其中两个保持同步。
  • @Origineil,当我将组合框值设置为“时间段”时,日期选择器必须根据时间段值(例如,当前月份)填充日期,并且当我编辑日期字段时与日期选择器相关联,“时间段”必须自动更改为“自定义”。
  • 您可以为此使用计算。查看这个答案:stackoverflow.com/a/22694205

标签: knockout.js knockout-subscribe


【解决方案1】:

正如@Origineil 所说,您可能需要重新考虑您的解决方案。

但如果你真的想保留当前的解决方案,你可以使用一个标志来打破循环。

var isInnerUpdate = false;

this.observable1.subscribe(function(value){
  if (isInnerUpdate) {
    isInnerUpdate = false;
  } else {
    isInnerUpdate = true;
    self.observable2("someValue");
  }
});

this.observable2.subscribe(function(value){
    if (isInnerUpdate) {
    isInnerUpdate = false;
  } else {
    isInnerUpdate = true;
    self.observable1("someValue");
  }
});

【讨论】:

    【解决方案2】:

    我使用了一个全局变量和逻辑如下,它对我来说很好,

    var enableSubcribe = false; //global variable 
    this.observable1.subscribe(function(value){ 
    enableSubcribe = true; 
    self.observable2("someValue");
    enableSubcribe = false; 
    }); 
    
    this.observable2.subscribe(function(value){
     if(!enableSubcribe ){
    self.observable1("someValue");
    }
     });
    

    感谢 Huocp,您的逻辑看起来也有效。感谢大家的cmets和回答。

    【讨论】:

    • 不确定您是否注意到,您的 enableSubscribe 不是全局变量,它是一个仅在您的视图模型构造函数的函数范围内可见的变量。
    • 抱歉,全局变量必须声明为 this.enableSubcribe = ko.observable();在构造函数中。
    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多