Knockout.js 退出键在击倒JS中不起作用 预期结果:

Knockout.js 退出键在击倒JS中不起作用 预期结果:,knockout.js,binding,keypress,Knockout.js,Binding,Keypress,当在键入[name]值时按下“escape键”时,它应返回到以前的值 实际结果: 即使按下“退出键”,值也保持不变 jsiddle您希望ctrl-z键行为附加到escape键作为escape键,而不是为撤消按时所做的更改而构建的 为了实现这一点,我们可以使用keydown事件,因为keypress不会检测到退出键 查看: <input type="text" data-bind="value: name" /> <input id="test" type="text" da

当在键入[name]值时按下“escape键”时,它应返回到以前的值

实际结果: 即使按下“退出键”,值也保持不变


jsiddle

您希望
ctrl-z
键行为附加到
escape
键作为escape键,而不是为撤消按时所做的更改而构建的

为了实现这一点,我们可以使用
keydown
事件,因为
keypress
不会检测到退出键

查看:

 <input type="text" data-bind="value: name" />
<input id="test" type="text" data-bind="value: name,event:{keydown :escKey}" />
<pre data-bind="text:ko.toJSON($data,null,2)"></pre>
工作样本

或者,您可以使用
BiningHandler
来实现类似的功能,但将其作为最后手段。

谢谢超级酷:)

根据super cool的回答,我创建了一个自定义绑定处理程序来解决这个问题。嗯,这是一样的,但对我来说,如果要在bindingHandler中执行,则viewmodel更干净

var model = function(){
    var self=this;
    self.name= ko.observable("smith");
    self.escKey= function (data, event) {
        if (event && event.keyCode == 27) {
            $('#test').val(data.name());
        }
        return true;
    }
};
ko.applyBindings(new model());

这是jsfiddle

非常好,非常感谢。但是我认为我应该尝试在代码的基础上创建一个自定义bindingHandler,因为我不希望我的viewmodel直接访问“#test”元素。谢谢:)
 ko.bindingHandlers.cancelOnEscape = {
        init: function (element, accessor) {
            var _accessor = accessor();

            $(element).keydown(function (event) {
                if (event && event.keyCode == 27) {
                    $(element).val(_accessor());
                }
                return true;
            });
        }
    };