前言
value綁定是關聯DOM元素的值到view model的屬性上。主要是用在表單控件<input>,<select>和<textarea>上。
當用戶編輯表單控件的時候, view model對應的屬性值會自動更新。同樣,當你更新view model屬性的時候,相對應的元素值在頁面上也會自動更新。
注:如果你在checkbox或者radio button上使用checked綁定來讀取或者寫入元素的 checked狀態,而不是value 值的綁定。
簡單示例
代碼如下對兩個input進行value的屬性綁定
<p>Login name: <input data-bind="value: userName"/></p> <p>Password: <input type="password" data-bind="value: userPassword"/></p> <script type="text/javascript" src="~/Scripts/knockout-2.3.0.debug.js"></script> <script type="text/javascript"> var viewModel = { userName: ko.observable(""), userPassword: ko.observable("abc") }; ko.applyBindings(viewModel); </script>
運行后效果為
注意密碼的type為password
KO設置此參數為元素的value值。之前的值將被覆蓋。
如果參數是監控屬性observable的,那元素的value值將根據參數值的變化而更新,如果不是,那元素的value值將只設置一次並且以后不在更新。
如果你提供的參數不是一個數字或者字符串(而是對象或者數組)的話,那顯示的value值就是yourParameter.toString() 的內容(通常沒用,所以最好都設置為數字或者字符串)。
不管什么時候,只要你更新了元素的值,那 KO都會將view model對應的屬性值自動更新。默認情況下當用戶離開焦點(例如onchange事件)的時候,KO才更新這個值,但是你可以通過第2個參數valueUpdate來特別指定改變值的時機。
valueUpdate
如果你使用valueUpdate參數,那就是意味着KO將使用自定義的事件而不是默認的離開焦點事件。下面是一些最常用的選項:
“change”(默認值) - 當失去焦點的時候更新view model的值,或者是<select> 元素被選擇的時候。
“keyup” – 當用戶敲完一個字符以后立即更新view model。
“keypress” – 當用戶正在敲一個字符但沒有釋放鍵盤的時候就立即更新view model。不像 keyup,這個更新和keydown是一樣的。
“afterkeydown” – 當用戶開始輸入字符的時候就更新view model。主要是捕獲瀏覽器的keydown事件或異步handle事件。
上述這些選項,如果你想讓你的view model進行實時更新,使用“afterkeydown”是最好的選擇。
<p>Your value: <input data-bind="value: someValue, valueUpdate: 'afterkeydown'"/></p> <p>You have typed: <span data-bind="text: someValue"></span></p>
someValue: ko.observable("edit me")
綁定下拉菜單drop-down list(例如SELECT)
Knockout對下拉菜單drop-down list綁定有一個特殊的支持,那就是在讀取和寫入綁定的時候,這個值可以是任意JavaScript對象,而不必非得是字符串。在你讓你用戶選擇一組model對象的時候非常有用。具體例子,參考options綁定。
類似,如果你想創建一個multi-select list,參考selectedOptions綁定。
更新observable和non-observable屬性值
如果你用value綁定將你的表單元素和你的observable屬性關聯起來,KO設置的2-way的雙向綁定,任何一方改變都會更新另外一方的值。
但是,如果你的元素綁定的是一個non-observable屬性(例如是一個原始的字符串或者JavaScript表達式) ,KO會這樣執行:
1.如果你綁定的non-observable屬性是簡單對象,例如一個常見的屬性值,KO會設置這個值為form表單元素的初始值,如果你改變form表單元素的值,KO會將值重新寫回到view mode的這個屬性。但當這個屬性自己改變的時候,元素卻不會再變化了(因為不是observable的),所以它僅僅是1-way綁定。
2.如果你綁定的non-observable屬性是復雜對象,例如復雜的JavaScript 表達式或者子屬性,KO也會設置這個值為form表單元素的初始值,但是改變form表單元素的值的時候,KO不會再寫會view model屬性,這種情況叫one-time-only value setter,不是真正的綁定。
例如:
<p>First value: <input data-bind="value: firstValue"/></p> <!-- two-way binding --> <p>Second value: <input data-bind="value: secondValue"/></p> <!-- one-way binding --> <p>Third value: <input data-bind="value: secondValue.length"/></p> <!-- no binding --> <script type="text/javascript"> var viewModel = { firstValue: ko.observable("hello"), // Observable secondValue: "hello, again"// Not observable }; ko.applyBindings(viewModel); </script>