javascript - AngularJS:如何处理路由 Controller 中的键盘快捷键?

标签 javascript angularjs angularjs-directive angular-ui-router keyboard-shortcuts

如何在使用路由的 AngularJS 1.5 应用中实现特定于页面的键盘快捷键

这就是我想要实现的目标:

index.html:

<!doctype html>
<html data-ng-app="myApp">
<body data-ng-keydown="onKeyDown($event)">
    ...
    <div data-ng-view></div>
    ...
</body>
</html>

据我了解,如果您的范围内没有聚焦的元素(例如输入字段,我),您需要处理 标记上的按键事件没有那些)。

app.js:

var myApp = angular.module('myApp', ['ngRoute', 'myControllers']);

myApp.config(['$routeProvider', function ($routeProvider) {
    $routeProvider
        .when('/', {
            templateUrl: 'pages/home.html',
            controller: 'HomeCtrl'
        })
        .when('/create', {
            templateUrl: 'pages/create.html',
            controller: 'CreateCtrl'
        });
}]);

controllers.js:

var myControllers = angular.module('myControllers', []);

myControllers.controller('HomeCtrl', ['$scope', function ($scope) {

    $scope.closeLandingPagePopUp = function () {
        ...
    };

    $scope.onKeyDown = function ($event) {
        switch ($event.keyCode) {
            case 27: // [Esc]
                $scope.closeLandingPagePopUp();
                break;
            ...
        }
    };
}]);

myControllers.controller('CreateCtrl', ['$scope', function ($scope) {

    $scope.cancelCreation = function () {
        ...
    };

    $scope.onKeyDown = function ($event) {
        switch ($event.keyCode) {
            case 27: // [Esc]
                $scope.cancelCreation();
                break;
            ...
        }
    };
}]);

因此在两个页面上 [Esc] 键应该以不同的方式处理。

当然,HTML 属性 data-ng-keydown="onKeyDown($event)" 不起作用,因为它超出了 Controller 的范围。

有没有办法做到这一点,同时仍然将所有页面特定代码保留在各自的 Controller 中?

最佳答案

georgeawg's answer很鼓舞人心,但我最终得到了这个实现:

myControllers.controller('HomeCtrl', ['$scope', '$document', function ($scope, $document) {

    var handleKeyDown = function(event) {
        switch (event.keyCode) {
            case 27: // [Esc]
                $scope.closeLandingPagePopUp();
                break;
            ...
        }
        $scope.$apply();
    };
    $document.on('keydown', handleKeyDown);

    $scope.$on('$destroy', function() {
        $document.unbind('keydown', handleKeyDown);
    });
}]);

HTML 部分实际上没有什么可做的。

说明:

  1. 每个 Controller 都有一个handleKeyDown(event)函数来实现快捷键
  2. $document.on('keydown', handleKeyDown)在 Controller 初始化时将处理函数绑定(bind)到全局 keydown 事件。 $document是 Angular 的 jQuery 包装器。
  3. 当 Controller 被销毁时解除绑定(bind)处理程序
  4. 使用 $scope.$apply() 让 Angular 知道数据何时发生变化并且需要刷新 View

关于javascript - AngularJS:如何处理路由 Controller 中的键盘快捷键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36266285/

相关文章:

angularjs - RxJS - 加载指示器

javascript - CORS 问题 请求的资源上不存在 'access control allow origin header'

javascript - 如何从ISO8601标准日期格式中提取时间?

javascript - 将 jquery 插件转换为指令 Angular

javascript - 在脚本标签 block 之间调用 JavaScript 函数

javascript - jQuery 针对不同的窗口/弹出窗口

javascript - 端点异步轮询

javascript - 具有隐藏功能的 AngularJS 自定义指令

AngularJS 多指令资源争用

javascript - 如何从节点和链接列表创建 d3 径向树?