Die Hauptfrage - ist es möglich? Ich habe es ohne Glück versucht ..
Haupt-App.js
...
var app = angular.module('myApp', ['services']);
app.config(['customProvider', function (customProvider) {
}]);
...
Anbieter selbst
var services = angular.module('services', []);
services.provider('custom', function ($http) {
});
Und ich habe einen solchen Fehler:
Uncaught Error: Unknown provider: $http from services
Irgendwelche Ideen?
Vielen Dank!
javascript
angularjs
angular-services
Kosmetika
quelle
quelle
app.config
TeilAntworten:
Das Endergebnis ist:
Einzelheiten:
Angular Framework hat einen 2-Phasen-Initialisierungsprozess:
PHASE 1: Konfig
Während der
config
Phase werden alle Anbieter initialisiert und alleconfig
Abschnitte ausgeführt. Dieconfig
Abschnitte können Code enthalten, der die Anbieterobjekte konfiguriert, und daher können ihnen Anbieterobjekte injiziert werden. Da die Anbieter jedoch die Fabriken für die Serviceobjekte sind und die Anbieter zu diesem Zeitpunkt noch nicht vollständig initialisiert / konfiguriert sind -> können Sie den Anbieter in dieser Phase nicht bitten, einen Dienst für Sie zu erstellen -> in der Konfigurationsphase können Sie / nicht verwenden Injektionsdienste . Nach Abschluss dieser Phase sind alle Anbieter bereit (nach Abschluss der Konfigurationsphase kann keine Anbieterkonfiguration mehr durchgeführt werden).PHASE 2: Ausführen
Während der
run
Phase werden allerun
Abschnitte ausgeführt. Zu diesem Zeitpunkt sind die Anbieter bereit und können Dienste erstellen -> während derrun
Phase können Sie Dienste verwenden / injizieren .Beispiele:
1. Injektion der
$http
Service Provider Initialisierungsfunktion WILL NOT ArbeitDa wir versuchen, den
$http
Dienst in eine Funktion einzufügen, die während derconfig
Phase ausgeführt wird, wird eine Fehlermeldung angezeigt:Was dieser Fehler tatsächlich aussagt, ist, dass das,
$httpProvider
was zum Erstellen des$http
Dienstes verwendet wird, noch nicht bereit ist (da wir uns noch in derconfig
Phase befinden).2. Injizieren
$http
Dienst in den Dienst Initialisierungsfunktion WILL Arbeit:Da wir den Service jetzt in die Service-Initialisierungsfunktion
run
einfügen , die während der Phase ausgeführt wird, funktioniert dieser Code.quelle
<script>var config = <% = mySettings.toJson() %>;</script>
. B. ). Dies kann mit einer Template-Engine wie Smarty für PHP, Jinja2 für Python, Nunchucks für NodeJS usw. erfolgenDies könnte Ihnen einen kleinen Hebel geben:
Aber seien Sie vorsichtig, die Erfolgs- / Fehlerrückrufe können Sie in einem Wettlauf zwischen dem Start der App und der Serverantwort halten.
quelle
angular.injector(['mymodule'])
- aber ich bin mir nicht sicher, ob Sie diesen Ansatz für den$http
Service verwenden können. Ich möchte sagen, dass ich es getan habe. Nicht sicher, ob dies hilft oder nicht: - /Dies ist eine alte Frage, anscheinend haben wir etwas mit Hühnerei zu tun, wenn wir uns auf die Kernkompetenz der Bibliothek verlassen wollen.
Anstatt das Problem grundlegend zu lösen, habe ich es umgangen. Erstellen Sie eine Direktive, die den gesamten Körper umschließt. Ex.
Muss jetzt
mc-body
vor dem Rendern (einmal) initialisiert werden, z.Auth
ist ein Dienstleister oder Anbieter, z.Mir scheint, ich habe die Kontrolle über die Reihenfolge des Bootstraps. Nachdem der reguläre Bootstrap die gesamte Anbieterkonfiguration aufgelöst hat und dann versucht, die
mc-body
Direktive zu initialisieren .Und diese Direktive scheint mir dem Routing voraus zu sein, da das Routing auch über eine Direktive ex injiziert wird.
<ui-route />
. Aber ich kann mich irren. Benötigt weitere Untersuchungen.quelle
Als Antwort auf Ihre Frage "Irgendwelche Ideen?" Hätte ich mit "Ja" geantwortet. Aber warte, da ist noch mehr!
Ich schlage vor, nur JQuery in der Konfiguration zu verwenden. Beispielsweise:
quelle