Zoeken…


Syntaxis

  • myApp.controller ('MyController', functie ($ scope) {...}); // niet-geminimaliseerde code

  • myApp.controller ('MyController', ['$ scope', functie ($ scope) {...}]); // ondersteuning minification

  • functie MyController () {}

    MyController. $ Inject = ['$ scope'];

    myApp.controller ('MyController', MyController); // $ injecteer annotatie

  • $ Injector.get ( 'injecteerbare'); // dynamische / runtime-injectie

Opmerkingen

Providers kunnen niet worden geïnjecteerd in run blokken.

Services of waarden kunnen niet in config worden geïnjecteerd.

Zorg ervoor dat u uw injecties annoteert zodat uw code niet breekt bij het verkleinen.

injecties

Het eenvoudigste voorbeeld van een injectie in een Angular-app - $scope injecteren naar een Angular Controller :

angular.module('myModule', [])
.controller('myController', ['$scope', function($scope) {
    $scope.members = ['Alice', 'Bob'];
    ...
}])

Het bovenstaande illustreert een injectie van een $scope in een controller , maar het is hetzelfde of u een module in een andere injecteert. Het proces is hetzelfde.

Het systeem van Angular is verantwoordelijk voor het oplossen van afhankelijkheden voor u. Als u bijvoorbeeld een service maakt, kunt u deze weergeven zoals in het bovenstaande voorbeeld en is deze beschikbaar voor u.

U kunt DI - Dependency Injection - overal gebruiken waar u een component definieert.

Merk op dat in het bovenstaande voorbeeld we "Inline Array Annotation" gebruiken. Dit betekent dat we expliciet als tekenreeksen de namen van onze afhankelijkheden schrijven. We doen dit om te voorkomen dat de toepassing breekt wanneer de code wordt geminimaliseerd voor productie. Codeminificatie verandert de namen van de variabelen (maar niet van strings), waardoor de injectie wordt verbroken. Door strings te gebruiken, weet Angular welke afhankelijkheden we willen.

Heel belangrijk - de volgorde van stringnamen moet hetzelfde zijn als de parameters in de functie.

Er zijn tools die dit proces automatiseren en voor u regelen.

Dynamische injecties

Er is ook een optie om componenten dynamisch aan te vragen. Je kunt het doen met de $injector service:

myModule.controller('myController', ['$injector', function($injector) {
    var myService = $injector.get('myService');
}]);

Opmerking: hoewel deze methode kan worden gebruikt om het probleem van circulaire afhankelijkheid te voorkomen dat uw app zou kunnen breken, wordt het niet als beste praktijk beschouwd om het probleem te omzeilen door het te gebruiken. Circulaire afhankelijkheid geeft meestal aan dat er een fout is in de architectuur van uw toepassing en u moet dit in plaats daarvan oplossen.

$ injecteer Property-annotatie

Evenzo kunnen we de annotatie van de eigenschap $inject gebruiken om hetzelfde te bereiken als hierboven:

var MyController = function($scope) {
  // ...
}
MyController.$inject = ['$scope'];
myModule.controller('MyController', MyController);

AngularJS-service dynamisch laden in vanille JavaScript

U kunt AngularJS-services in vanille JavaScript laden met de AngularJS- injector() -methode. Elk opgehaald jqLite-element dat angular.element() heeft een methode- injector() die kan worden gebruikt om de injector op te halen.

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);
}

In het bovenstaande voorbeeld proberen we het jqLite-element op te halen dat de root van de AngularJS-toepassing ( ngAppElement ) bevat. Om dat te doen, gebruiken we de methode angular.element() , op zoek naar een DOM-element met het kenmerk ng-app of data-ng-app of, als het niet bestaat, vallen we terug op het document . We gebruiken ngAppElement om de injectorinstantie op te halen (met ngAppElement.injector() ). De injector wordt bijvoorbeeld gebruikt om te controleren of de dienst te injecteren bestaat (met injector.has() ) en vervolgens de dienst laden (met injector.get() ) in service variabele.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow