AngularJS 创建全局键盘快捷键的方法是什么?

IT技术 javascript angularjs
2021-02-25 15:12:17

我想我应该使用指令,但是将指令添加到正文似乎很奇怪,但是在文档上监听事件。

这样做的正确方法是什么?

更新:找到了 AngularJS UI 并看到了他们对 keypress 指令实现。

6个回答

我会说更合适的方法(或“Angular 方法”)是将它添加到指令中。这是一个简单的方法(只需将keypress-events属性添加<body>):

angular.module('myDirectives', []).directive('keypressEvents', [
  '$document',
  '$rootScope',
  function($document, $rootScope) {
    return {
      restrict: 'A',
      link: function() {
        $document.bind('keypress', function(e) {
          console.log('Got keypress:', e.which);
          $rootScope.$broadcast('keypress', e);
          $rootScope.$broadcast('keypress:' + e.which, e);
        });
      }
    };
  }
]);

在您的指令中,您可以简单地执行以下操作:

module.directive('myDirective', [
  function() {
    return {
      restrict: 'E',
      link: function(scope, el, attrs) {
        scope.keyPressed = 'no press :(';
        // For listening to a keypress event with a specific code
        scope.$on('keypress:13', function(onEvent, keypressEvent) {
          scope.keyPressed = 'Enter';
        });
        // For listening to all keypress events
        scope.$on('keypress', function(onEvent, keypressEvent) {
          if (keypress.which === 120) {
            scope.keyPressed = 'x';
          }
          else {
            scope.keyPressed = 'Keycode: ' + keypressEvent.which;
          }
        });
      },
      template: '<h1>{{keyPressed}}</h1>'
    };
  }
]);
它绑定到 $document,而不是元素,这对我在 div 上获取关键事件有用。+1 也用于展示如何注入 $document。
2021-04-25 15:12:17
为什么它不捕获Escape密钥?
2021-04-29 15:12:17
一路走好,很干净。
2021-05-14 15:12:17
@SaeedNeamati 见 Yehuda Katz 对 Resig 的回复ejohn.org/blog/keypress-in-safari-31
2021-05-16 15:12:17
根据上面的代码,该指令将事件绑定到 window.document ($document) 元素,同时它可以附加到任何 DOM 标签,而不仅仅是 <body>,因为没有验证。在这种情况下,指令所附加的元素可以被销毁,但绑定的事件侦听器将保留。我建议要么在那里进行一些验证(将元素限制为 <body>),要么实现使用 $scope.on('destroy') 解除绑定事件侦听器的方法。
2021-05-20 15:12:17

使用$document.bind

function FooCtrl($scope, $document) {
    ...
    $document.bind("keypress", function(event) {
        console.debug(event)
    });
    ...
}
这种方法禁用了其他变量的自动更新,{{ abc }}
2021-04-25 15:12:17
似乎有两种方法,一种是创建指令并通过$event函数将其传递到控制器中,另一种是直接在控制器中绑定事件。控制器方法似乎更少的代码和相同的结果。是否有理由选择一种方法而不是另一种方法?
2021-04-26 15:12:17
您需要应用更改 var that = this; $document.bind("keydown", function(event) { $scope.$apply(function(){ that.handleKeyDown(event); });
2021-05-09 15:12:17
这种方法每次按键都会给我多个事件触发器,我使用了捕鼠器而不是 $document.bind ,它似乎足够了。
2021-05-14 15:12:17

我现在还不能保证,但我已经开始研究 AngularHotkeys.js:

http://chieffancypants.github.io/angular-hotkeys/

一旦我开始使用它,将更新更多信息。

更新 1:哦,有一个 nuget 包:angular-hotkeys

更新 2:实际上非常易于使用,只需在您的路线中或像我一样在您的控制器中设置您的绑定:

hotkeys.add('n', 'Create a new Category', $scope.showCreateView);
hotkeys.add('e', 'Edit the selected Category', $scope.showEditView);
hotkeys.add('d', 'Delete the selected Category', $scope.remove);

这是我使用 jQuery 完成此操作的方法 - 我认为有更好的方法。

var app = angular.module('angularjs-starter', []);

app.directive('shortcut', function() {
  return {
    restrict: 'E',
    replace: true,
    scope: true,
    link:    function postLink(scope, iElement, iAttrs){
      jQuery(document).on('keypress', function(e){
         scope.$apply(scope.keyPressed(e));
       });
    }
  };
});

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
  $scope.keyCode = "";
  $scope.keyPressed = function(e) {
    $scope.keyCode = e.which;
  };
});
<body ng-controller="MainCtrl">
  <shortcut></shortcut>
  <h1>View keys pressed</h1>
  {{keyCode}}
</body>

Plunker 演示

奇怪的是有一个指令,但没有服务。指令 - 可重用的 ui 组件(在大多数情况下)。
2021-05-02 15:12:17
链接:函数 postLink(scope, iElement, iAttrs){ window.addEventListener('load', function(e){ scope.$apply(scope.keyPressed(e)); }, false); }
2021-05-06 15:12:17
每次我在 Angular 中听到 JQuery 时都会起鸡皮疙瘩
2021-05-11 15:12:17
感谢您的回复。我看到你认为我们应该按照指示去做。
2021-05-14 15:12:17

这是键盘快捷键的 AngularJS 服务示例:http : //jsfiddle.net/firehist/nzUBg/

然后可以像这样使用它:

function MyController($scope, $timeout, keyboardManager) {
    // Bind ctrl+shift+d
    keyboardManager.bind('ctrl+shift+d', function() {
        console.log('Callback ctrl+shift+d');
    });
}

更新:我现在使用angular-hotkeys代替。

优秀的小提琴,但我们可以在指令中绑定所有快捷方式,以便我可以在我的应用程序中调用吗?
2021-05-11 15:12:17