javascript - 2.2.0 版本异常键触发的 knockout.js 值绑定(bind)

标签 javascript data-binding knockout.js

考虑以下简单示例:

<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

建议?

最佳答案

我按照上面建议的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 行为。

参见 http://jsfiddle.net/Rmcza/26/

关于javascript - 2.2.0 版本异常键触发的 knockout.js 值绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13506539/

相关文章:

javascript - KnockoutJS 待办事项列表应用程序中的 ko.compulated

javascript - jQuery ui 效果下降正在消失

Javascript - 尝试使用 innerHTML 但不会仅在瞬间更改文本

c# - 与 UI 怪癖的两种方式绑定(bind)

javascript - 为什么 AngularJS 中的双向数据绑定(bind)是一种反模式?

c# - 递归局部 View

javascript - Phonegap SYNTAX_ERR 上的 SQLITE 查询错误

asp.net - 使用 onkeypress 时 window.location.href 在 Safari 中不起作用

javascript - Nativescript UI-Builder 和数据绑定(bind)

javascript - knockout 示例模板示例不起作用