Ich möchte einen Dienst in app.config einfügen, damit Daten abgerufen werden können, bevor der Controller aufgerufen wird. Ich habe es so versucht:
Bedienung:
app.service('dbService', function() {
return {
getData: function($q, $http) {
var defer = $q.defer();
$http.get('db.php/score/getData').success(function(data) {
defer.resolve(data);
});
return defer.promise;
}
};
});
Konfiguration:
app.config(function ($routeProvider, dbService) {
$routeProvider
.when('/',
{
templateUrl: "partials/editor.html",
controller: "AppCtrl",
resolve: {
data: dbService.getData(),
}
})
});
Aber ich bekomme diesen Fehler:
Fehler: Unbekannter Anbieter: dbService von EditorApp
Wie korrigiere ich das Setup und injiziere diesen Service?
Antworten:
Alex hat den richtigen Grund angegeben, warum er nicht in der Lage ist, das zu tun, was Sie versuchen, also +1. Dieses Problem tritt jedoch auf, weil Sie nicht genau festlegen, wie sie entworfen wurden.
resolve
Nimmt entweder die Zeichenfolge eines Dienstes oder eine Funktion, die einen zu injizierenden Wert zurückgibt. Da Sie Letzteres tun, müssen Sie eine tatsächliche Funktion übergeben:Wenn das Framework aufgelöst wird,
data
wird esdbService
in die Funktion eingefügt , sodass Sie es frei verwenden können. Sie müssen überhaupt nicht in denconfig
Block injizieren , um dies zu erreichen.Guten Appetit!
quelle
.service
, so bewegen$q
und$http
dort.pageData: 'myData'
, müssten dann aberpageData.overview
von Ihrem Controller aus anrufen . Die Zeichenfolgenmethode ist wahrscheinlich nur dann nützlich, wenn die Service Factory anstelle einer API ein Versprechen zurückgegeben hat. Die Art und Weise, wie Sie es derzeit tun, ist wahrscheinlich die beste.Richten Sie Ihren Dienst als benutzerdefinierten AngularJS-Anbieter ein
Trotz allem , was die akzeptierte Antwort sagt, Sie tatsächlich CAN tun , was Sie zu tun beabsichtigen, aber Sie müssen es einrichten als konfigurierbares Anbieter, so dass es während der Konfigurationsphase als Dienst verfügbar ist .. Zuerst Ihre ändern
Service
zu einem Anbieter Wie nachfolgend dargestellt. Der Hauptunterschied besteht darin, dass Sie nach dem Festlegen des Werts vondefer
diedefer.promise
Eigenschaft auf das Versprechenobjekt setzen , das zurückgegeben wird von$http.get
:Provider Service: (Provider: Servicerezept)
Jetzt haben Sie einen konfigurierbaren benutzerdefinierten Anbieter, den Sie nur noch injizieren müssen. Der Hauptunterschied ist hier der fehlende "Provider on your injizable".
config:
Verwenden Sie aufgelöste Daten in Ihrem
appCtrl
Mögliche Alternativen
Die folgende Alternative ist ein ähnlicher Ansatz, ermöglicht jedoch die Definition innerhalb von
.config
und kapselt den Dienst innerhalb des spezifischen Moduls im Kontext Ihrer App. Wählen Sie die für Sie passende Methode. Im Folgenden finden Sie Hinweise zu einer dritten Alternative und hilfreiche Links, mit denen Sie all diese Dinge besser verstehen könnenEinige hilfreiche Ressourcen
$http
im Kontext dieser Anfrage spezifisch gemacht habefactory
/service
/provider
bei clevertech.biz .Der Anbieter bietet Ihnen etwas mehr Konfiguration als die
.service
Methode, was sie als Anbieter auf Anwendungsebene besser macht. Sie können dies jedoch auch im Konfigurationsobjekt selbst kapseln, indem Sie$provide
wie folgt in die Konfiguration einfügen:quelle
$get
Anrufs. Stattdessen möchten Sie der Provider-Instanz Methoden hinzufügen undthis
beim Aufruf einfach zurückkehren$get
. In Ihrem Beispiel könnten Sie sogar nur einen Dienst verwenden ... In einem Anbieter können Sie auch keine Dienste wie injizieren$http
. Und übrigens ist dies//return the factory as a provider, that is available during the configuration phase
irreführende / falsche InformationenKurze Antwort: Sie können nicht. Mit AngularJS können Sie keine Dienste in die Konfiguration einfügen, da nicht sicher ist, ob sie korrekt geladen wurden.
Siehe diese Frage und Antwort: AngularJS-Abhängigkeitsinjektion von Wert innerhalb von module.config
quelle
Ich glaube nicht, dass Sie dazu in der Lage sein sollten, aber ich habe erfolgreich einen Dienst in einen
config
Block eingefügt. (AngularJS v1.0.7)quelle
.config
Sie haben cacheBuster (der an keiner Stelle in der Antwort definiert ist) und dogmaCacheBusterProvider (der nicht weiter verwendet wird) geschrieben. Wirst du das klären?cacheBuster
wird als Parameter der Konfigurationsfunktion definiert. In Bezug aufdogmaCacheBusterProvider
ist es etwas Kluges, das Angular mit Namenskonventionen macht, das ich längst vergessen habe. Dies könnte Sie näher bringen, stackoverflow.com/a/20881705/110010 ..provider()
Rezept definieren . Was passiert, wenn ich etwas mit.factory('ServiceName')
oder.service('ServiceName')
Rezept definiere und eine seiner Methoden im.config
Block verwenden möchte ? Setzen Sie den Parameter als ServiceNameProvider, aber meine Anwendung wird gestoppt .Sie können den $ injiz-Dienst verwenden, um einen Dienst in Ihre Konfiguration einzufügen
Quelle: http://odetocode.com/blogs/scott/archive/2014/04/21/better-error-handling-in-angularjs.aspx
** Fordern Sie mit angular.injector explizit Dienste von anderen Modulen an **
Um die Antwort von kim3er näher zu erläutern , können Sie Dienste, Fabriken usw. bereitstellen, ohne sie zu Anbietern zu ändern, sofern sie in anderen Modulen enthalten sind ...
Ich bin mir jedoch nicht sicher, ob das
*Provider
(das intern durch Winkel hergestellt wird, nachdem es einen Service oder eine Fabrik verarbeitet hat) immer verfügbar sein wird (es kann davon abhängen, was zuerst geladen wird), da Winkel Module träge lädt.Beachten Sie, dass die Werte, wenn Sie sie erneut einfügen möchten, als Konstanten behandelt werden sollen.
Hier ist ein expliziterer und wahrscheinlich zuverlässigerer Weg, dies zu tun + ein funktionierender Plunker
quelle
Verwenden von $ insertor zum Aufrufen von Dienstmethoden in config
Ich hatte ein ähnliches Problem und löste es mithilfe des oben gezeigten $ injor-Dienstes. Ich habe versucht, den Dienst direkt zu injizieren, aber am Ende hatte ich eine zirkuläre Abhängigkeit von $ http. Der Dienst zeigt ein Modal mit dem Fehler an und ich verwende das UI-Bootstrap-Modal, das auch von $ https abhängig ist.
quelle
Eine sehr einfache Lösung
Hinweis : Dies gilt nur für einen asynchronen Aufruf, da der Dienst bei der Ausführung der Konfiguration nicht initialisiert wird.
Sie können
run()
Methode verwenden. Beispiel:Dein Code :
quelle
Nun, ich hatte ein wenig Probleme mit diesem, aber ich habe es tatsächlich getan.
Ich weiß nicht, ob die Antworten aufgrund einer Änderung des Winkels veraltet sind, aber Sie können dies folgendermaßen tun:
Dies ist Ihr Service:
Und das ist die Konfiguration
quelle
Einfachster Weg:
$injector = angular.element(document.body).injector()
Verwenden Sie das dann, um
invoke()
oder auszuführenget()
quelle