使用 Knockout 订阅的循环依赖

Posted

技术标签:

【中文标题】使用 Knockout 订阅的循环依赖【英文标题】:Cyclic dependency using Knockout subscribe 【发布时间】: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,当我将组合框值设置为“时间段”时,日期选择器必须根据时间段值(例如,当前月份)填充日期,并且当我编辑日期字段时与日期选择器相关联,“时间段”必须自动更改为“自定义”。 您可以为此使用计算。查看这个答案:***.com/a/22694205 【参考方案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();在构造函数中。

以上是关于使用 Knockout 订阅的循环依赖的主要内容,如果未能解决你的问题,请参考以下文章

spring的循环依赖及使用三级缓存解决循环依赖;注入bean到spring容器中

Spring如何解决循环依赖?

大厂面试三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)

Spring是如何解决循环依赖的?

Spring的循环依赖问题

Spring处理循环依赖只使用二级缓存可以吗?