AngularJS
Iniezione di dipendenza
Ricerca…
Sintassi
myApp.controller ('MyController', function ($ scope) {...}); // codice non minificato
myApp.controller ('MyController', ['$ scope', function ($ scope) {...}]); // supporto minification
function MyController () {}
MyController. $ Inject = ['$ scope'];
myApp.controller ('MyController', MyController); // $ inserisce l'annotazione
$ Injector.get ( 'iniettabile'); // Iniezione dinamica / runtime
Osservazioni
I provider non possono essere iniettati in blocchi di run
.
Servizi o valori non possono essere iniettati in blocchi di config
.
Assicurati di annotare le iniezioni in modo che il codice non si interrompa in minification.
iniezioni
L'esempio più semplice di un'iniezione in un'app Angular: l'iniezione di $scope
a un Controller
angolare:
angular.module('myModule', [])
.controller('myController', ['$scope', function($scope) {
$scope.members = ['Alice', 'Bob'];
...
}])
Quanto sopra illustra un'iniezione di $scope
in un controller
, ma è lo stesso se si inserisce un modulo in un altro. Il processo è lo stesso.
Il sistema di Angular è incaricato di risolvere le dipendenze per te. Se crei un servizio, ad esempio, puoi elencarlo come nell'esempio sopra e sarà disponibile per te.
È possibile utilizzare DI - Dipendenza iniezione - ovunque si stia definendo un componente.
Si noti che nell'esempio precedente viene utilizzata la cosiddetta "Annotazione di array in linea". Significa, scriviamo esplicitamente come stringhe i nomi delle nostre dipendenze. Lo facciamo per prevenire l'interruzione dell'applicazione quando il codice viene ridotto per la produzione. La minificazione del codice cambia i nomi delle variabili (ma non le stringhe), che interrompe l'iniezione. Usando le stringhe, Angular sa quali dipendenze vogliamo.
Molto importante: l'ordine dei nomi delle stringhe deve essere uguale ai parametri nella funzione.
Esistono strumenti che automatizzano questo processo e si prendono cura di questo per te.
Iniezioni dinamiche
C'è anche un'opzione per richiedere dinamicamente i componenti. Puoi farlo usando il servizio $injector
:
myModule.controller('myController', ['$injector', function($injector) {
var myService = $injector.get('myService');
}]);
Nota: mentre questo metodo potrebbe essere usato per prevenire il problema della dipendenza circolare che potrebbe interrompere la tua app, non è considerata una buona pratica aggirare il problema usandolo. La dipendenza circolare di solito indica che c'è un'anomalia nell'architettura della tua applicazione, e dovresti invece indirizzarla.
$ inietta annotazione di proprietà
Equivalentemente, possiamo usare l'annotazione di proprietà $inject
per ottenere lo stesso risultato sopra:
var MyController = function($scope) {
// ...
}
MyController.$inject = ['$scope'];
myModule.controller('MyController', MyController);
Carica dinamicamente il servizio AngularJS in JavaScript vaniglia
È possibile caricare i servizi AngularJS in JavaScript vanilla utilizzando il metodo injector()
AngularJS. Ogni elemento jqLite richiamato chiamando angular.element()
ha un metodo injector()
che può essere utilizzato per recuperare l'iniettore.
var service;
var serviceName = 'myService';
var ngAppElement = angular.element(document.querySelector('[ng-app],[data-ng-app]') || document);
var injector = ngAppElement.injector();
if(injector && injector.has(serviceNameToInject)) {
service = injector.get(serviceNameToInject);
}
Nell'esempio precedente proviamo a recuperare l'elemento jqLite che contiene la radice dell'applicazione AngularJS ( ngAppElement
). Per fare ciò, usiamo il metodo angular.element()
, cercando un elemento DOM contenente l'attributo ng-app
o data-ng-app
o, se non esiste, torniamo all'elemento document
. Usiamo ngAppElement
per recuperare l'istanza di injector (con ngAppElement.injector()
). L'istanza di injector viene utilizzata per verificare se il servizio da iniettare esiste (con injector.has()
) e quindi per caricare il servizio (con injector.get()
) all'interno della variabile di service
.