逃生键在Knockout JS中不起作用

时间:2015-09-08 02:46:10

标签: knockout.js binding keypress

 <input type="text" data-bind="value: name" />

预期结果:

当为[name]键入值时按下“转义键”,它应该返回到之前的值。

实际结果:

即使我按下“退出键”

值仍保持不变

jsfiddle here

2 个答案:

答案 0 :(得分:2)

您希望将ctrl-z密钥行为附加到escape密钥,因为转义密钥不是为了撤消您的更改而构建的。

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

查看:

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

<强>视图模型:

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());

工作样本 here

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

答案 1 :(得分:0)

非常感谢超酷:)

基于超酷的答案,我创建了一个自定义绑定处理程序来解决这个问题。嗯,它是相同的,但对我来说,如果你打算在bindingHandler中做你的viewmodel更清洁。

 ko.bindingHandlers.cancelOnEscape = {
        init: function (element, accessor) {
            var _accessor = accessor();

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

这里是jsfiddle http://jsfiddle.net/6h1bbLm9/4/