自定义绑定不再适用于KnockoutJS 3.0

Bri*_*man 4 javascript mvvm knockout.js knockout-3.0

突然之间,以下代码在定位KnockoutJS 3.0时不再有效.我该如何解决这个问题?

JavaScript的:

ko.bindingHandlers.limitCharacters = {
    update: function(element, valueAccessor, allBindingsAccessor, viewModel)
    {
       element.value = element.value.substr(0, valueAccessor());
       allBindingsAccessor().value(element.value.substr(0, valueAccessor()));
    }
};
Run Code Online (Sandbox Code Playgroud)

HTML:

<textarea data-bind="value: comment, valueUpdate: 'afterkeydown', limitCharacters: 20"></textarea>
Run Code Online (Sandbox Code Playgroud)

见小提琴:http: //jsfiddle.net/ReQrz/1/

nem*_*esv 6

在KO 3.0中,绑定是独立的并且是有序的.您可以在这里阅读更多相关信息,这应该被视为一个"突破性变化",来自上面的链接示例:

v2.x关于绑定之间依赖关系的行为(在上面的"独立和有序绑定"一节中描述)是一个 未记录的内部实现细节,所以希望你不依赖它.但是如果你依赖于那么显然你会看到行为的改变,因为绑定在v3中是独立的.您需要停止依赖交叉绑定依赖项,这样可以使您的代码更清晰,更易于理解.

所以你的绑定不再起作用,因为它假设当你的comment属性被改变时它也会激发limitCharacters你的limitCharacters绑定,尽管你的绑定与comment属性无关.

解决此问题的一种可能解决方案是,您需要通过使用以下内容来访问其值来显式声明处理程序中value绑定的依赖关系:updateallBindingsAccessor().value();

ko.bindingHandlers.limitCharacters = {
    update: function(element, valueAccessor, allBindingsAccessor, viewModel)
    {
       var val = allBindingsAccessor().value();       
       allBindingsAccessor().value(val.substr(0, valueAccessor()));
    }
};
Run Code Online (Sandbox Code Playgroud)

演示JSFiddle.