自定义绑定在KnockoutJS 3.0中不再工作
Custom binding no longer working in KnockoutJS 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()));
}
};
HTML:
<textarea data-bind="value: comment, valueUpdate: 'afterkeydown', limitCharacters: 20"></textarea>
参见小提琴:http://jsfiddle.net/ReQrz/1/
在KO 3.0中,绑定是独立的和有序的。你可以在这里阅读更多关于这一点的信息,这应该被认为是一个"突破性的变化",来自上面链接的例子:
v2.x关于绑定之间依赖关系的行为(在上面关于"独立和有序绑定"的部分),是未记录的内部实现细节所以希望您没有依赖它。但如果你依赖它,那么显然你会查看行为的变化,因为绑定在v3中是独立的设计您需要停止依赖交叉绑定依赖项,顺便说一句,这将使您的代码更干净、更容易懂
所以绑定不再工作,因为它假设当comment
属性更改时,它也会触发limitCharacters
绑定,尽管limitCharacters
绑定与comment
属性无关。
解决此问题的一个可能的解决方案是,您需要在update
处理程序中显式声明对value
绑定的依赖关系,方法是使用allBindingsAccessor().value();
:访问其值
ko.bindingHandlers.limitCharacters = {
update: function(element, valueAccessor, allBindingsAccessor, viewModel)
{
var val = allBindingsAccessor().value();
allBindingsAccessor().value(val.substr(0, valueAccessor()));
}
};
演示JSFiddle。
nemesv是完全正确的。
他的修改内容简短易读。然而,它的一个缺点是,当in超过极限时,可观察到的被调用两次。
如果你不想这样,一个解决方案是创建一个从原始值派生的自定义值绑定器。
(function() {
var limitValueBindingHandler = {};
var valueBindingHandler = ko.bindingHandlers.value;
for(var attr in valueBindingHandler) {
if (valueBindingHandler.hasOwnProperty(attr)) {
limitValueBindingHandler[attr] = valueBindingHandler[attr];
}
}
limitValueBindingHandler.init = function(element, valueAccessor, allBindings) {
var limitCharacters = allBindings.get("limitCharacters");
element.addEventListener("keydown", function() {
setTimeout(function() {
//this is called after the element's value is updated
//but before value binding event handler
element.value = element.value.substr(0, limitCharacters);
}, 0);
}, false);
valueBindingHandler.init(element, valueAccessor, allBindings);
}
ko.bindingHandlers['limitValue'] = limitValueBindingHandler;
})();
样品:http://jsfiddle.net/DAFN6/
相关文章:
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 当我更改innerHtml时,引导选项卡事件不再工作
- 天气应用 API 不再工作
- AngularJS Dropdown在使用指令后不再工作
- 虚拟键盘在更新到 Chrome v50 后不再工作
- $(这个)没有't在onClick事件中不再工作
- 升级至Knockout 3.0.0,Templates/Custom Binding Handlers不再工作
- 自定义绑定在KnockoutJS 3.0中不再工作
- 为什么不是'我的jQuery不再工作了
- 为什么 ngClick 在$compile后不再工作
- AngularJs 路由不再工作.地址栏更改,但视图不会更改
- yam.platform.setAuthToken在IE 8和IE 9中不再工作
- 节点.js版本已更改,脚本不再工作
- 是 ngAnimate 不再工作了
- .click() 不再工作 jquery.
- JS点击功能不再工作以更改链接颜色
- 谷歌地图API不再工作
- 事件处理程序在 html 重新呈现后不再工作
- Javascript检测不再工作
- Rails:Paperclip gem在切换计算机后不再工作