天天看點

Knockout應用開發指南 第五章:建立自定義綁定

你可以建立自己的自定義綁定 – 沒有必要非要使用内嵌的綁定(像click,value等)。你可以你封裝複雜的邏輯或行為,自定義很容易使用和重用的綁定。例如,你可以在form表單裡自定義像grid,tabset等這樣的綁定。

重要:以下文檔隻應用在Knockout 1.1.1和更高版本,Knockout 1.1.0和以前的版本在注冊API上是不同的。

注冊你的綁定

添加子屬性到ko.bindingHandlers來注冊你的綁定:

… 然後就可以在任何DOM元素上使用了:

注:你實際上沒必要把init和update這兩個callbacks都定義,你可以隻定義其中的任意一個。

update 回調

當管理的observable改變的時候,KO會調用你的update callback函數,然後傳遞以下參數:

element — 使用這個綁定的DOM元素

valueAccessor —JavaScript函數,通過valueAccessor()可以得到應用到這個綁定的model上的目前屬性值。

allBindingsAccessor —JavaScript函數,通過allBindingsAccessor ()得到這個元素上所有model的屬性值。

viewModel — 傳遞給ko.applyBindings使用的 view model參數,如果是模闆内部的話,那這個參數就是傳遞給該模闆的資料。

例如,你可能想通過 visible綁定來控制一個元素的可見性,但是你想讓該元素在隐藏或者顯示的時候加入動畫效果。那你可以自定義自己的綁定來調用jQuery的slideUp/slideDown 函數:

然後你可以像這樣使用你的綁定:

當然,看來可能代碼很多,但是一旦你建立了自定義綁定,你就可以在很多地方重用它。

init 回調

Knockout在DOM元素使用自定義綁定的時候會調用你的init函數。init有兩個重要的用途:

為DOM元素設定初始值

注冊事件句柄,例如當使用者點選或者編輯DOM元素的時候,你可以改變相關的observable值的狀态。

 KO會傳遞和update回調函數一樣的參數。

繼續上面的例子,你可以像讓slideVisible在頁面第一次顯示的時候設定該元素的狀态(但是不使用任何動畫效果),而隻是讓動畫在以後改變的時候再執行。你可以這樣來做:

這就是說giftWrap的初始值聲明的是false(例如giftWrap: ko.observable(false)),然後讓初始值會讓關聯的DIV隐藏,之後使用者點選checkbox的時候會讓元素顯示出來。

DOM事件之後更新observable值

你已經值得了如何使用update回調,當observable值改變的時候,你可以更新相關的DOM元素。但是其它形式的事件怎麼做呢?比如當使用者對某個DOM元素有某些action操作的時候,你想更新相關的observable值。

你可以使用init回調來注冊一個事件句柄,這樣可以改變相關的observable值,例如,

現在你可以通過hasFocus綁定來讀取或者寫入這個observable值了:

繼續閱讀