2

我正在寻找一种方法来将许多不同的键绑定到我的视图模型中的不同操作/功能。

我发现了这个示例,其中使用绑定处理程序将操作绑定到输入键。

但是如何修改这个处理程序以支持提供的键码?我希望能够对所有类型的键使用相同的处理程序,并且最好还与修饰键结合使用。

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;
        });
    }
};
4

1 回答 1

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

这是一个演示此绑定的小提琴。

于 2013-04-12T18:09:08.710 回答