2012-11-18 71 views
6

幾件我沒有得到的東西。 根據KO文檔(以及SO上的許多帖子),查詢和編寫可觀察數據時應使用括號。但是,當綁定子屬性時,對我而言,如果使用括號,則無關緊要。挖空嵌套對象和括號

<span data-bind="text: selectedMessage() && selectedMessage().message().subject()"></span> 
<span data-bind="text: selectedMessage() && selectedMessage().message().subject"></span> 

=都返回正確的值。

任何人都可以向我解釋爲什麼這是?

小提琴:http://jsfiddle.net/viktorb/DKg74/

回答

6

如果綁定值是可觀察到的,KO「解開」爲你,讓你不必須使用圓括號(或調用ko.utils.unwrapObservable)自行解包。

在第二個示例中,綁定值爲:selectedMessage() && selectedMessage().message().subject。當此表達式評估爲subject屬性時,KO會發現所評估的值是可觀察的,因此它會爲您解開它。 (在內部,這可能只是對ko.utils.unwrapObservable的調用)。

但是,由於表達評估對message屬性,我假設也是可觀察到的,用於訪問該屬性的括號是必需的(例如selectedMessage().message.subject不會工作)。

+0

感謝您的意見。很有幫助。 – judehall

4

文檔一樣說:

觀測的整點是,他們可以觀察到,即,其它代碼可以說,它希望被通知的變化。這就是KO內置綁定的許多內部功能。所以,當你編寫data-bind =「text:personName」時,文本綁定註冊自己,以便在personName更改時(假設它是一個可觀察值,現在是它)通知它。

它是關於是否observable或不。

查看閱讀和書面觀察http://knockoutjs.com/documentation/observables.html欲瞭解更多信息。

我已經修改了你的撥弄了一下,你可以看到有和沒有括號的區別:http://jsfiddle.net/DKg74/1/

+0

Thx供您參考。很有幫助。 – judehall