2013-03-21 78 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