考虑以下简单示例:
<input data-bind="value: query, valueUpdate: 'afterkeydown'"/>
在 knockoutjs 2.1.0 中,当我按 ctrl、向上箭头、向下箭头、Shift 绑定(bind)不被触发并且查询
没有更新。
在 knockoutjs 2.2.0 中,绑定(bind)会触发所有上述按键。
这对一些现有代码造成了严重破坏(这是一个自动完成,向上和向下箭头经常用于从下拉列表中进行选择)。
哪种行为是正确的?我假设从技术上讲,后者是正确的,因为按下这些键是一个按键事件,但绑定(bind)不应该只在值发生变化时触发吗?
我想让一切都保持实时,docs state :
"afterkeydown" is the best choice if you want to keep your view model updated in real-time
建议?
- ko 2.1.0 演示:http://jsfiddle.net/Rmcza/7/
- ko 2.2.0 演示:http://jsfiddle.net/Rmcza/8/
最佳答案
我按照上面建议的subscribe
方法,但是看起来有点乱,不符合knockout的精神。一位同事建议编写一个扩展程序,在没有更改的情况下抑制绑定(bind)(这将模拟 2.1 行为):
ko.extenders.suppressNoChange= function(target) {
var result = ko.computed({
read: target,
write: function(newValue) {
var current = target();
if (newValue!== current) {
target(newValue);
}
}
});
result(target());
return result;
};
所以现在我们可以扩展我们的计算可观察量,以便在没有发生任何变化的情况下不会触发绑定(bind)。
我们可以这样使用它:
ko
.computed({
read: function(){},
write: function(v){})
.extend({
suppressNoChange: null
});
并允许我对问题中的 2.2 fiddle 进行非常小的更改以恢复 2.1 行为。
关于javascript - 2.2.0 版本异常键触发的 knockout.js 值绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13506539/