Mark und Blesh haben großartige Antworten; jedoch hat Marks Antwort einen Fehler, den Blesh (abgesehen davon, dass sie komplex zu implementieren ist) aufzeigt, und ich finde, dass Blesh's Antwort einen semantischen Fehler enthält, wenn es darum geht, einen Service zu erstellen, der sich speziell darauf konzentriert, Fokus-Anfragen an das Frontend zu senden, wenn er eigentlich nur einen Weg brauchte, um das Ereignis zu verzögern, bis alle Direktiven zuhören.
Also hier ist, was ich letztendlich gemacht habe, das sich stark von Blesh's Antwort inspirieren lässt, aber die Semantik des Controller-Ereignisses und des "nach Laden"-Services separat hält.
Dies ermöglicht es, das Controller-Ereignis leicht für andere Dinge als nur das Fokussieren eines bestimmten Elements anzuschließen, und erlaubt auch, den Overhead der "nach Laden"-Funktionalität nur zu verursachen, wenn es benötigt wird, was in vielen Fällen nicht der Fall sein muss.
Verwendung
app.controller('MyCtrl', function($scope, afterLoad) {
function notifyControllerEvent() {
$scope.$broadcast('controllerEvent');
}
afterLoad(notifyControllerEvent);
});
Quelltext
app.directive('focusOn', function() {
return function(scope, elem, attr) {
scope.$on(attr.focusOn, function(e, name) {
elem[0].focus();
});
};
});
app.factory('afterLoad', function ($rootScope, $timeout) {
return function(func) {
$timeout(func);
}
});