2015-05-01 90 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