Ich habe einen Dienst für Verknüpfungen erstellt.
Es sieht aus wie:
angular.module('myApp.services.shortcuts', [])
.factory('Shortcuts', function($rootScope) {
var service = {};
service.trigger = function(keycode, items, element) {
}
return service;
})
Und ich habe es in einen Controller injiziert:
angular.module('myApp.controllers.mainCtrl', [])
.controller('mainCtrl', function($scope, $element, $document, Shortcuts) {
$document.on('keydown', function(){
if(event.target.tagName !== "INPUT") {
Shortcuts.trigger(event.which, $scope.items, $element);
}
})
})
Es funktioniert, aber Sie werden vielleicht bemerken, dass ich $ element und $ document in den Controller einspeise.
Es ist eine schlechte Controller-Praxis und verstößt gegen die Konvention "Nie auf $ zugreifen" in der Controller-Konvention.
Ich sollte es in die Direktive setzen und dann 'ngKeydown' und $ event verwenden, um den Dienst auszulösen.
Aber ich denke, der Service ist in Ordnung und ich werde den Controller früher überarbeiten.
Aktualisiert:
Es scheint, dass 'ng-keydown' nur in Eingabe-Tags funktioniert.
Also schreibe ich einfach eine Direktive und füge $ document ein:
angular.module('myApp.controllers.mainCtrl', [])
.directive('keyboard', function($scope, $document, Shortcuts) {
return {
link: function(scope, element, attrs) {
scope.items = ....;
$document.on('keydown', function(){
if(event.target.tagName !== "INPUT") {
Shortcuts.trigger(event.which, scope.items, element);
}
})
}
}
})
Es ist besser.