自定义绑定valueAccessor具有意外结果

时间:2013-03-21 10:56:53

标签: knockout.js ko-custom-binding

我对knockout.js的自定义绑定中的以下行为感到难过:

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/

2 个答案:

答案 0 :(得分:1)

您需要在自定义绑定调用中为valueAccessor传递所需的模型属性。在您的情况下,您需要模型属性'someText':

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

请参阅http://jsfiddle.net/j5y8H/1/

答案 1 :(得分:1)

您正在混淆一点 - valueAccessor 参数可以访问绑定的值 (就像您已经发现的那样)。

另一方面,“值”绑定只是另一种绑定,甚至可能不会出现在应用你的元素上 - 或者根本不存在(例如在div上)。

如果你真的想要访问绑定到 value 绑定的属性(最有可能的话,你可能想重新考虑你的绑定处理程序),你可以通过 allBindingsAccessor 参数,如:

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