使用Knockout将任何键(通过键码)绑定到动作

时间:2013-04-12 17:32:37

标签: javascript knockout.js

我正在寻找一种方法将许多不同的键绑定到我的viewmodel中的不同操作/函数。

我发现这个example,其中绑定处理程序用于将操作绑定到enter键。

但是如何修改此处理程序以支持提供的密钥代码?我希望能够为所有类型的键使用相同的处理程序,最好还结合修饰键。

ko.bindingHandlers.executeOnEnter = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var allBindings = allBindingsAccessor();
        $(element).keypress(function (event) {
            var keyCode = (event.which ? event.which : event.keyCode);
            if (keyCode === 13) {
                allBindings.executeOnEnter.call(viewModel);
                return false;
            }
            return true;
        });
    }
};

1 个答案:

答案 0 :(得分:3)

你可以这样做:

ko.bindingHandlers.actionKey = {
    init: function(element, valueAccessor, allBindings, data) {
        var handler = function(data, event) {
            var keys = ko.utils.unwrapObservable(allBindings().keys) || [13]; //default to Enter Key
            if (!Array.isArray(keys))
                keys = [keys];
            if (keys.indexOf(event.keyCode) > -1) {
                valueAccessor().call(data, data, event);
            };
        };
        var newValueAccessor = function() {
            return { keyup: handler };
        };
        ko.bindingHandlers.event.init(element, newValueAccessor, allBindings, data);
    }
};

你可以像这样使用这个绑定:

Observable Keys: <input data-bind="actionKey: action, keys: keyCodes" /><br/>
Inline Keys: <input data-bind="actionKey: action, keys: [33, 34]" /><br/>
Inline Key: <input data-bind="actionKey: action, keys: 33" /><br/>
Default Keys: <input data-bind="actionKey: action" /><br/>

以下a fiddle证明了这种约束力。