2015-05-01 91 views
0

如果isVisible属性存在,则根据值打开或关闭信息框。Knockout:Prevenet将属性添加到计算的相关性列表中

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

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

问题是,我不希望infoboxStateisDim更改时不会被调用。有什么办法可以告诉计算机不向它的依赖列表中添加属性吗?

+0

包括其他相关代码 –

回答

1

如果您不希望在计算的observable的上下文中将可观察的读取注册为依赖项,则需要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); 
+0

嗨,谢谢你的回答。问题在于'performAdditionalBehaviors'方法中,我设置'isDim'的值,而'peek()'只用于读取属性的值。 – Habib

+0

设置值不会注册为依赖项,只能在读取时进行注册。 –

+0

非常感谢杰夫澄清这:),它现在工作。我已经阅读过这篇文章,但这是我的不良阅读(其中明确提到:P)和错误的概念。 – Habib