我可以兩種不同的方式寫入一個knockoutjs數據綁定表達式:Knockoutjs VS屬性綁定到屬性()
1. <div data-bind="text: FirstName"></div>
2. <div data-bind="text: FistName()"></div>
注姓後兩個括號中的第二示例。他們都似乎工作。有區別嗎?
我可以兩種不同的方式寫入一個knockoutjs數據綁定表達式:Knockoutjs VS屬性綁定到屬性()
1. <div data-bind="text: FirstName"></div>
2. <div data-bind="text: FistName()"></div>
注姓後兩個括號中的第二示例。他們都似乎工作。有區別嗎?
是有區別的。
他們只會工作都如果FirstName
是ko.observable
。如果它是一個普通的值,只有第一個變體可以工作。
可觀察值不直接保存其值。這是提供訪問值的函數。因此,它必須是,調用才能獲得該值(即,嚴格正確的是text: FistName()
)。
但淘汰賽是有益的,並預測到。因此,如果你沒有自己做,它會爲你調用觀察值。
負責此操作的是幫助函數ko.utils.unwrapObservable()
,它接受一個參數,確定它是可觀察值還是普通值,並在兩種情況下都返回其值。
淘汰賽採用每綁定你定義了這個功能,因此,如果調用的可觀察自己(text: FistName()
)或讓淘汰賽做幕後(text: FirstName
)背後也沒關係。
夸克:
淘汰賽解析綁定表達式<binding>: <expr>
並且確定是否<expr>
是一個簡單的標識符或更復雜的東西。
每當<expr>
是一個簡單的標識符,就像FirstName
-knockout將自動應用unwrapObservable()
,因爲情況是明確的。
但是,無論何時<expr>
更復雜 - 就像'Dear ' + FirstName
-knockout從表達式構造自定義函數。現在事情變得模糊不清,你需要自己調用observable,如下所示:'Dear ' + FirstName()
。
我會建議你閱讀下面的文章:從文章 [10 Things to Know About KnockoutJS]
報價:
大多數綁定將調用
ko.utils.unwrapObservable
傳遞 到它的價值,這將安全返回值對於兩個可觀察的和不可觀測的。但是,如果在一個綁定中使用 表達式中的可觀察值,則需要將其作爲函數進行引用。同樣,在 代碼中,除非實際想要傳遞observable本身(而不是 值),否則通常需要引用您的observable作爲函數 。
<div data-bind="visible: someFlag">...</div>
<div data-bind="visible: !someFlag()">...</div>
謝謝你們!現在有道理。 – buddyspike28 2012-08-14 09:34:45