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

Bind any key (by keycode) to an action using Knockout

本文关键字:一个 绑定 Knockout 任何键 通过 keycode 使用      更新时间:2023-09-26

我正在寻找一种方法,将许多不同的键绑定到我的视图模型中的不同动作/函数。

我发现这个例子中使用绑定处理程序将操作绑定到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;
        });
    }
};

你可以这样做:

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/>