2013-03-21 37 views
2

我對以下行爲在自定義綁定knockout.js的難倒:定製結合valueAccessor有意想不到的結果

ko.bindingHandlers.customBinding = { 
    update: function(element, valueAccessor, allBindingsAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     console.log(JSON.stringify(value)); 
    } 
} 

ko.applyBindings({ 
    someText: ko.observable("inital value") 
}); 

<input type="text" data-bind="value: someText, customBinding: {some: 'option'}"> 

valueAccessor()應該給我的視圖模型屬性與元素的值綁定(即可觀察到的someText)。引用文檔:

valueAccessor - JavaScript函數,您可以調用該函數以獲取此綁定中涉及的當前模型屬性。在不傳遞任何參數的情況下調用此函數(即調用valueAccessor())以獲取當前的模型屬性值。

然而,它真的是返回綁定值,即{some: 'option'}

我錯過了什麼?

http://jsfiddle.net/j5y8H/

回答

1

您需要將您想要的模型屬性爲您valueAccessor在custombinding通話。在你的情況,你想要的模型屬性「someText」:

<input type="text" data-bind="value: someText, customBinding: someText"> 

http://jsfiddle.net/j5y8H/1/

+1

啊我明白了。這就說得通了。它沒有按照我預期的方式工作,但它與'value'綁定工作的方式一致。這與文檔說明它的方式不一致。 'valueAccessor'將是您在綁定中傳遞的任何內容,不一定是「當前模型屬性」。謝謝。 – Tomalak 2013-03-21 13:25:39

+0

是的。你傳給你的任何東西都可以從allBindingsAccessor中獲取。我已經做了一個快速示例,我在這裏傳遞了一個名爲'source'的屬性中的字符串:http://jsfiddle.net/j5y8H/3/(或者您可以拿起Grim指出的'value'屬性) – 2013-03-21 13:38:01

1

你混了一點東西 - 在valueAccessor參數可以訪問你的結合值(就像你已經發現的那樣)。

另一方面,「value」綁定只是另一個綁定,它可能不會出現在您應用的元素上,或者根本不存在(例如在div上)。

如果你真的想訪問被綁定到結合(和最有可能的,如果你這樣做,你可能要重新考慮你的綁定句柄)的屬性,可以通過allBindingsAccessor參數做到這一點,像即:

ko.utils.unwrapObservable(allBindingsAccessor().value); 
+1

是的,我現在也發現了一個。 :-)事實上,我被文檔誤導了,或者說我誤解了它。我的計劃是建立一個自定義綁定,創建一個jQueryUI datepicker(例如),我想注入一個對象到包含它的選項的綁定。就像'template'綁定的工作。 – Tomalak 2013-03-21 13:48:41

+0

我不知道jQuery datepicker是如何工作的,但是我爲一些MooTools日期選擇器插件做了類似的事情,並且我發現直接在我的處理程序中處理值更新和事件,完全繞過了綁定的使用,導致更少的頭痛。 :) – Grim 2013-03-21 14:09:57