使用 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容器中