In Angular können wir $routeProvider
die config
Funktion injizieren
module.config(function ($routeProvider) {
});
Ich möchte meinen Service gerne einbringen
module.config(function ($routeProvider, myService) {
});
Ich bin sicher, dass der Dienst richtig definiert ist, aber es wird eine Ausnahme ausgelöst, die besagt, dass unknown myService
Ereignis, wenn ich wie injiziere
module.config(function ($routeProvider, $http) {
});
es sagt immer noch unknown $http
.
Weißt du, warum?
$http
nur für die Konfiguration injizieren, dh als$httpProvider
: docs.angularjs.org/api/ng/provider/$httpProviderAntworten:
Auf der Seite "Module", Abschnitt "Laden und Abhängigkeiten von Modulen ":
Sie können also keinen eigenen Dienst oder integrierte Dienste wie $ http in config () einfügen. Verwenden Sie stattdessen run () .
quelle
Ich habe nicht genug Ruf, um einen Kommentar zu schreiben, wollte aber Marks Antwort ergänzen.
Sie können Anbieter selbst registrieren. Sie sind im Grunde Objekte (oder Konstruktoren) mit einer
$get
Methode. Wenn Sie einen Anbieter registrieren, kann die Standardversion davon wie ein Dienst oder eine Fabrik verwendet werden, eine Anbieterversion kann jedoch früher verwendet werden. Also eingrumpy
Anbieter, der als registriert istangular.module('...', []) .provider('grumpy', GrumpyProviderObject)
ist dann in der Konfigurationsfunktion als verfügbar
.config(['grumpyProvider', ..., function (grumpyProvider, ...) { ... }])
und kann einfach als in Steuerungen injiziert werden
.controller('myController', ['grumpy', ..., function (grumpy, ...) { ... }])
Das
grumpy
Objekt, in das injiziert wird,myController
ist einfach das Ergebnis der Ausführung der$get
Methode auf demGrumpyProviderObject
. Beachten Sie, dass der von Ihnen registrierte Anbieter auch ein regulärer JavaScript-Konstruktor sein kann.Hinweis: Gemäß dem Kommentar von @Problematic muss die Provider-Initialisierung (der Aufruf von
angular.module().provider(…)
muss vor der Konfigurationsfunktion erfolgen, um verfügbar zu sein).quelle
constant
s, da Konstanten auch Anbieter sind.Sie können es so machen:
(function() { 'use strict'; angular.module('name', name).config(config); // You can do this: config.$inject = ['$routeProvider', 'myService']; function config($routeProvider, myService) { // Or better to use this, but you need to use ng-annotate: /* ngInject */ } });
Es ist eine bewährte Methode, die hier beschrieben wird
quelle
Configuration blocks: get executed during the provider registrations and configuration phase. Only providers and constants can be injected into configuration blocks. This is to prevent accidental instantiation of services before they have been fully configured.
Sie können manuell anrufen
angular.injector
, um Zugriff auf Dienste zu erhalten, die während des.config()
Blockierens Ihrer App keine Abhängigkeiten aufweisen . Wenn der von Ihnen erstellte Dienst keine Abhängigkeiten aufweist, die durchlaufen werden müssen, können Sie wahrscheinlich Folgendes verwenden:angular.module('myApp').config(function () { var myService = angular.injector(['ng']).get('myService'); });
Dies funktioniert auch für andere einfache Dienste wie
$http
:angular.module('myApp').config(function () { var http = angular.injector(['ng']).get('$http'); });
Hinweis: Normalerweise sollten Sie während Ihrer Konfigurationsphase keine Dienste einfügen müssen. Es ist besser, einen Anbieter zu erstellen, der die Konfiguration ermöglicht. Die Dokumente sagen, dass diese Funktionalität für Fälle verfügbar ist, in denen Bibliotheken von Drittanbietern Zugriff auf den Injektor einer bereits laufenden Angular-App benötigen.
quelle
$injector.get('serviceName')
einen Dienst aufrufen , der noch nicht instanziiert wurde (wie im.config()
Block), versucht der Injektor, diesen Dienst sofort zu instanziieren. Wenn dieser Dienst Abhängigkeiten aufweist, wird ein Fehler ausgegeben, da diese Deps fehlen. Leider können Sie die Abhängigkeiten beim Aufruf nicht angeben.get()
.$location
hat eine Abhängigkeit von$rootElement
, kann also nicht auf diese Weise geladen werden.Wenn Sie eine Abhängigkeit (z. B. von einem Dienst) einfügen möchten, um ein Funktionsformular in Routen (.config) aufzurufen, wie unten gezeigt templateProvider.getTemplate ('about')
.state('index.about', { url: "/about", templateUrl: templateProvider.getTemplate('about'), controller: 'AboutCtrl', controllerAs: 'about', data: {pageTitle: 'About Us Page'} })
Sie müssen einen Provider erstellen. Weder Service noch Fabrik.
Hier ist ein echtes Beispiel eines Anbieters, der den Vorlagenpfad aus dem Namen generiert:
(function () { 'use strict'; angular .module('mega-app') .provider('template', provider); function provider(CONSTANT) { // The provider must include a $get() method This $get() method // will be invoked using $injector.invoke() and can therefore use // dependency-injection. this.$get = function () { return {} }; /** * generates template path from it's name * * @param name * @returns {string} */ this.getTemplate = function (name) { return CONSTANT.TEMPLATES_URL + name + '/' + name + '.html'; } /** * generates component path from it's name * @param name * @returns {string} */ this.getComponent = function (name) { return CONSTANT.COMPONENTS_URL + name + '.html'; } }; })();
Die Verwendung eines solchen Anbieters in den Routen (.config) ist wie folgt:
(function () { 'use strict'; angular .module('mega-app') .config(routes); function routes($stateProvider, $urlRouterProvider, templateProvider) { $stateProvider //---------------------------------------------------------------- // First State //---------------------------------------------------------------- .state('index', { abstract: true, url: "/index", templateUrl: templateProvider.getComponent('content'), controller: 'IndexCtrl', controllerAs: 'index', }) //---------------------------------------------------------------- // State //---------------------------------------------------------------- .state('index.home', { url: "/home", templateUrl: templateProvider.getTemplate('home'), controller: 'HomeCtrl', controllerAs: 'home', data: {pageTitle: 'Home Page'} }) //---------------------------------------------------------------- // State //---------------------------------------------------------------- .state('index.about', { url: "/about", templateUrl: templateProvider.getTemplate('about'), controller: 'AboutCtrl', controllerAs: 'about', data: {pageTitle: 'About Us Page'} }) //---------------------------------------------------------------- // Default State //---------------------------------------------------------------- $urlRouterProvider.otherwise('/index/home'); }; })();
VIP Hinweis:
Um den Provider zu injizieren, müssen Sie ihn mit xxxProvider postfixieren (dieser Name des Providers sollte nicht postfixiert werden, sondern nur beim Injizieren in die .config).
quelle
Wenn es einigen von Ihnen die Sache leichter machen kann.
Wie in dieser Antwort erläutert , können Sie einfach
Provider
an Ihren benutzerdefinierten Dienst anhängen und dann mit auf die internen Funktionen zugreifen$get()
.Es ist vielleicht nicht die sauberste Lösung, aber es macht den Job.
module.config(function ($routeProvider, myServiceProvider) { // Call a function hello() on myService. myServiceProvider.$get().hello(); });
quelle
$locationProvider
wie es ist. Es ist bereits ein Anbieter. Keine Notwendigkeit, den$get()
Hack zu verwenden. Vermisse ich etwasangular.module('modulename').config(['$routeprovider','$controllerprovider',function($routeprovider,$controllerprovider){ angular.module('modulename').controllerProvider = $controllerProvider; angular.module('modulename').routeprovider=$routeprovider; $routeprovider.when('/',{ templateUrl: 'urlname', controller: 'controllername', resolve:{ 'variable':variablenamewithvalue } }).otherwise({ redirectTo: '/' }); }]);
quelle
Sie könnten dies versuchen:
module.config(['$routeProvider', '$http', function ($routeProvider, $http) {}]);
quelle