【发布时间】:2016-03-28 16:16:47
【问题描述】:
如何在使用 routing 的 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>
据我了解,如果您在范围内没有聚焦的元素(例如输入字段,我没有),您需要处理 &lt;body&gt; 标记上的按键事件。
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)" 不起作用,因为它超出了控制器的范围。
有没有办法做到这一点,同时仍然将所有页面特定代码保留在各自的控制器中?
【问题讨论】:
-
你应该使用小指令而不是控制器。
标签: javascript angularjs angularjs-directive angular-ui-router keyboard-shortcuts