2015-05-15 55 views
0

試圖學習Knockoutjs.i已經找到Knockoutjs自定義綁定相關的代碼,但這不是很好。什麼時候需要Knockoutjs自定義綁定

<input data-bind="value: name" /> 
<hr/> 
<div data-bind="fadeInText: name"></div> 

ko.bindingHandlers.fadeInText = { 
    update: function(element, valueAccessor) { 
     $(element).hide(); 
     ko.bindingHandlers.text.update(element, valueAccessor); 
     $(element).fadeIn(); 
    } 
}; 

var viewModel = { 
    name: ko.observable("Bob") 
}; 

ko.applyBindings(viewModel); 

我只是不明白當人們去自定義綁定?

1)如果可能的話告訴我幾個情況,當自定義綁定將是選項?

2)如果有人看到代碼,那麼他們可以理解自定義綁定fadeInText和viewModel沒有關係,但它仍然工作。怎麼樣 ? 3)如果會有多個視圖模型,那麼我怎樣才能指定視圖模型名稱綁定時的綁定名稱?上面的代碼http://jsfiddle.net/rniemeyer/SmkpZ/

4)如何實現相同的輸出,而不自定義綁定的

的jsfiddle鏈路?有可能嗎?

請明智地回答我的問題。感謝

+2

這是我寫回來的文章,可能有助於您的一些問題:http://www.knockmeout.net/2011/07/another-look-at-custom-bindings-for.html –

+0

順便說一下@RPNiemeyer好文章。幫助我真正開始使用自定義綁定。 –

+0

自定義處理程序的原因是什麼?純度。視圖模型不應該直接進行任何視圖操作(即DOM的東西)。它只應該操縱數據/模型本身。綁定處理程序隔離viewModel中的所有DOM操作(以及jQuery的東西),這使得它保持純淨並且可測試得多。 –

回答

4

這裏有幾個答案:

  1. 自定義綁定在許多情況下是有用的,在我看來,不應該被用來作爲最後的手段。無論何時,如果您想以內置綁定不支持的方式連接DOM和數據,那麼它們是一個不錯的選擇。正如我上面列出的,here是一篇文章,可以幫助澄清。

  2. 自定義綁定通過調用ko.bindingHandlers.text.update間接與視圖模型有關係。所以,它正在有效地包裝實際的text綁定。 text綁定讀取傳入的值並顯示。

  3. 對於多視圖模型,此answer描述了一些處理多視圖模型的選項。

  4. 如果沒有自定義綁定,可以選擇不使用jQuery並使用CSS(考慮瀏覽器支持和前綴)。例如,你可以馬上添加一個類的元素,如:

有了這樣的CSS:

.message { 
    opacity: 0; 
    transition: opacity 2s ease-in; 
} 

.load { 
    opacity: 1; 
} 

的元素將開始opacity: 0,並立即轉換到opacity: 1超過2秒。

我不會推薦直接在視圖模型中使用jQuery。自定義綁定是您可以用於這些場景的工具,並提供Knockout提供的大部分功能。

希望這會有所幫助。

+0

'subscribe'呢? –

+0

@ Invent-Animate - 抱歉,我沒有關注。使用'.subscribe'來應對變化? –

+0

那麼,在文檔中,它確實會說「對於高級用戶,如果您想註冊自己的訂閱以通知觀察對象的更改,則可以調用他們的訂閱功能。」...我或多或少地「探測「而不是暗示 –

相關問題