Sök…


Syntax

  • myApp.controller ('MyController', funktion ($ scope) {...}); // icke-minifierad kod

  • myApp.controller ('MyController', ['$ scope', funktion ($ scope) {...}]); // stöd minifiering

  • funktion MyController () {}

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

    myApp.controller ('MyController', MyController); // $ injicera annotering

  • $ Injector.get ( 'injicerbar'); // dynamisk / runtime-injektion

Anmärkningar

Providers kan inte injiceras i run block.

Tjänster eller värden kan inte injiceras i config .

Se till att kommentera dina injektioner så att din kod inte går sönder vid minifiering.

injektioner

Det enklaste exemplet på en injektion i en Angular-app - att injicera $scope till en Angular Controller :

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

Ovanstående illustrerar en injektion av ett $scope i en controller , men det är samma om du injicerar någon modul i någon annan. Processen är densamma.

Angular system ansvarar för att lösa beroenden för dig. Om du till exempel skapar en tjänst kan du lista den som i exemplet ovan och den är tillgänglig för dig.

Du kan använda DI - Dependency Injection - var du än definierar en komponent.

Observera att i exemplet ovan använder vi vad som kallas "Inline Array Annotation". Det betyder att vi uttryckligen skriver som strängar namnen på våra beroenden. Vi gör det för att förhindra att applikationen bryts när koden minifieras för produktion. Kodminifiering ändrar namnen på variablerna (men inte strängar), vilket bryter injektionen. Genom att använda strängar vet Angular vilka beroenden vi vill ha.

Mycket viktigt - ordningen på strängnamn måste vara densamma som parametrarna i funktionen.

Det finns verktyg som automatiserar denna process och tar hand om den här åt dig.

Dynamiska injektioner

Det finns också ett alternativ att dynamiskt begära komponenter. Du kan göra det med $injector :

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

Obs! Medan den här metoden kan användas för att förhindra det cirkulära beroendesproblemet som kan bryta din app, anses det inte som bästa praxis att kringgå problemet genom att använda det. Cirkulärt beroende indikerar vanligtvis att det finns en brist i applikationens arkitektur, och du bör ta itu med det istället.

$ injicera egendomskommentarer

På samma sätt kan vi använda anteckningen $inject egendom för att uppnå detsamma som ovan:

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

Ladda AngularJS-tjänsten dynamiskt i vanilj JavaScript

Du kan ladda AngularJS-tjänster i vanilj JavaScript med hjälp av AngularJS injector() -metoden. Varje jqLite-element som hämtas angular.element() har en injector() som kan användas för att hämta injektorn.

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

I exemplet ovan försöker vi hämta jqLite-elementet som innehåller roten till AngularJS-applikationen ( ngAppElement ). För att göra det använder vi angular.element() -metoden, söker efter ett DOM-element som innehåller ng-app eller data-ng-app attribut eller, om det inte finns, faller vi tillbaka till document . Vi använder ngAppElement att hämta injektorinstans (med ngAppElement.injector() ). Injektorn instans används för att kontrollera om tjänsten till injekt existerar (med injector.has() ) och sedan att läsa in tjänsten (med injector.get() ) inuti service variabel.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow