淘汰赛:防止 属性 添加到计算的依赖列表中

Knockout: Prevenet a property from adding into a computed's dependency list

我有一个信息框,它根据 isVisible 的值打开或关闭 属性。

self.infoboxState = ko.computed(function () {
     if (!ko.computedContext.isInitial()) {
          self.performAdditionalBehaviors();
     }
     return ko.unwrap(self.isVisible)? 'infobox-open' : 'infobox-closed';
}, this);

当我们第二次设置isVisible的值时,它也会执行performAdditionalBehaviors()方法。此方法包含一个可观察对象 属性 isDim 并且 infoboxState 变得依赖于两个可观察对象,这意味着 isDim 属性 中的任何更改现在也将调用 infoboxState。我从 getDependenciesCount() 验证了现在设置为 2.

问题是我不希望 infoboxStateisDim 更改时被调用。有没有办法告诉计算器不要将 属性 添加到它的依赖项列表中?

如果您不希望在计算的可观察对象的上下文中将可观察的读取注册为依赖项,您需要 peek() 值而不是简单地读取它。

Controlling dependencies using peek

此外,您的 performAdditionalBehaviors() 甚至不应该在计算的可观察对象中。如果 isVisible 属性 发生变化,您希望这些行为发生,您应该改为订阅它。

this.infoboxState = ko.computed(function () {
     return ko.unwrap(this.isVisible)? 'infobox-open' : 'infobox-closed';
}, this);
this.infoboxState.subscribe(function () {
     this.performAdditionalBehaviors();
}, this);