2012-08-14 145 views
1

我可以兩種不同的方式寫入一個knockoutjs數據綁定表達式:Knockoutjs VS屬性綁定到屬性()

1. <div data-bind="text: FirstName"></div> 
2. <div data-bind="text: FistName()"></div> 

注姓後兩個括號中的第二示例。他們都似乎工作。有區別嗎?

回答

1

是有區別的。

他們只會工作如果FirstNameko.observable。如果它是一個普通的值,只有第一個變體可以工作。

可觀察值不直接保存其值。這是提供訪問值的函數。因此,它必須是,調用才能獲得該值(即,嚴格正確的是text: FistName())。

但淘汰賽是有益的,並預測到。因此,如果你沒有自己做,它會爲你調用觀察值。

負責此操作的是幫助函數ko.utils.unwrapObservable(),它接受一個參數,確定它是可觀察值還是普通值,並在兩種情況下都返回其值。

淘汰賽採用每綁定你定義了這個功能,因此,如果調用的可觀察自己(text: FistName())或讓淘汰賽做幕後(text: FirstName)背後也沒關係。


夸克:

淘汰賽解析綁定表達式<binding>: <expr>並且確定是否<expr>是一個簡單的標識符或更復雜的東西。

每當<expr>是一個簡單的標識符,就像FirstName -knockout將自動應用unwrapObservable(),因爲情況是明確的。

但是,無論何時<expr>更復雜 - 就像'Dear ' + FirstName -knockout從表達式構造自定義函數。現在事情變得模糊不清,你需要自己調用observable,如下所示:'Dear ' + FirstName()

比較:http://jsfiddle.net/Tomalak/cU4qw/

0

我會建議你閱讀下面的文章:從文章 [10 Things to Know About KnockoutJS]

報價:

大多數綁定將調用ko.utils.unwrapObservable傳遞 到它的價值,這將安全返回值對於兩個可觀察的和不可觀測的。但是,如果在一個綁定中使用 表達式中的可觀察值,則需要將其作爲函數進行引用。同樣,在 代碼中,除非實際想要傳遞observable本身(而不是 值),否則通常需要引用您的observable作爲函數 。

<div data-bind="visible: someFlag">...</div> 
<div data-bind="visible: !someFlag()">...</div> 
+0

謝謝你們!現在有道理。 – buddyspike28 2012-08-14 09:34:45