2012-02-23 46 views
10

我注意到,在值綁定不工作,如果是否定KnockoutJS:爲什麼否定在knockoutjs綁定值都被解開

像這樣:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled }" 

沒有按」 t正確拾取否定的addButtonEnabled變量。

然而,這並不工作:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled() }" 

爲什麼,這已經被解開,在其他沒有?

我正在使用淘汰賽1.2.1。

回答

15

讓我來解釋一下KO如何在你的例子中解析綁定。

事實上,數據綁定包含JSON。 KO用{}符號包裝並評估爲正常的JS代碼。 在您的例子KO了這個對象評估後:

{ 
    showTip: enableTip, 
    css: { disabled: !addButtonEnabled } 
} 

css bindingHandler接收節點的綁定,應適用於和bindingAccessor功能。

評估此功能後,我們得到一個「參數」爲css綁定。其等於對象

{ disabled: !addButtonEnabled } 

然後css bindingHandler遍歷該對象的屬性來設置相應的樣式。當涉及disabled屬性時,我們需要爲它讀取值。

通常所有標準綁定都以這種方式讀取值:ko.utils.unwrapObservable(value)如果value不可觀察或存儲在此可觀察變量中,則返回value。你的情況value = !addButtonEnabled。正如你所見,!addButtonEnabled是JavaScript表達式,不可觀察。所以它只是評估這個表達式。所以實際上你的按鈕總是被啓用,因爲observable() != false

在第二種情況下,要評估的值包含observable的值,所以它的工作原理是正確的。我想你

+0

非常有用。謝謝! – GRGodoi 2013-03-23 23:25:06

+0

我知道這是舊的,但我正在尋找這個,因爲'disabled:observable1 || observable2'不需要展開那些可觀察對象中的任何一個,但我希望它們應該出於與您的答案相同的原因 - 綁定是指javascript表達式,而不僅僅是可觀察對象。 – xdumaine 2014-08-18 17:06:57