使用Knockout将任何按键(通过按键代码)绑定到动作 [英] Bind any key (by keycode) to an action using Knockout

查看:83
本文介绍了使用Knockout将任何按键(通过按键代码)绑定到动作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm looking for a method to bind many different keys to different actions/functions in my viewmodel.

我找到了这个

I've found this example where a binding handler is used to bind actions to the enter-key.

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

But how do I modify this handler to also support a supplied key-code? I'd like to be able to use the same handler for all kinds of keys and preferably also combined with modifier keys.

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

,您可以像这样使用此绑定:

and you can use this binding in like this:

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

这是一个小提琴,表明了这种绑定.

Here is a fiddle demonstrating this binding.

这篇关于使用Knockout将任何按键(通过按键代码)绑定到动作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆