3

考虑以下简单的示例:

<input data-bind="value: query, valueUpdate: 'afterkeydown'"/>

在 knockoutjs 2.1.0 中,当我按下 , , 中的任何一个时,绑定ctrl不会被触发并且不会更新。Up arrowDown arrowShiftquery

在 knockoutjs 2.2.0 中,绑定会针对上述所有按键触发。

这对一些现有代码造成了严重破坏(它是一个自动完成功能,并且经常使用向上和向下箭头从下拉列表中进行选择)。

哪种行为是正确的?我假设从技术上讲,后者是正确的,因为这些按下这些键一个 keydown 事件,但是如果值发生变化,绑定不应该只触发吗?

我想保持一切实时,文档状态

如果您想实时更新视图模型,“afterkeydown”是最佳选择

建议?

4

2 回答 2

3

我按照subscribe上面建议的方法,但它似乎有点乱,不符合淘汰赛的精神。一位同事建议编写一个扩展器,在没有变化的情况下抑制绑定(这将模拟 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;
};

所以现在我们可以扩展我们计算的 observables,这样绑定就不会在没有发生变化的情况下触发。

我们可以按如下方式使用它:

ko
  .computed({
     read: function(){},
     write: function(v){})
  .extend({
     suppressNoChange: null
  });

并允许我对问题中的 2.2 小提琴进行非常小的更改以恢复 2.1 行为。

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

于 2012-11-23T18:40:32.260 回答
1

我认为这是RP Niemeyer 在 9 月所做的更改的结果。它导致计算的可观察对象在触发时始终写入,即使值没有更改。

您会在这个小提琴中注意到,在使用非计算的 observable 时不会发生这种情况。我使用显式订阅对此进行了测试,并且向下箭头不会触发该事件。

this.test = ko.observable('');
this.test.subscribe(function(newValue) {
    alert("The test value new name is " + newValue);
});

也许 Ryan 可以解释为什么会发生这种变化,以及为什么在这种情况下计算的行为与常规的 observables 不同。您可能想在 GitHub 页面上提出问题。

于 2012-11-22T06:57:30.450 回答