2016-08-09 92 views
5

Ich bin neu in Angular. Ich studiere Config-Block und führe Block von Modulen.Was ist der Unterschied zwischen Provider und Instanzen in Angular?

Bitte haben Sie einen Blick auf folgenden Code:

angular.module('myModule', []). 
config(function(injectables) { // provider-injector 
// This is an example of config block. 
// You can have as many of these as you want. 
// You can only inject Providers (not instances) 
// into config blocks. 
}). 
run(function(injectables) { // instance-injector 
// This is an example of a run block. 
// You can have as many of these as you want. 
// You can only inject instances (not Providers) 
// into run blocks 
}); 

Wie Sie im Konfigurationsblock sehen es steht geschrieben: „Sie können nur Provider injizieren (nicht Instanzen)“.

Was bedeutet das? Könnte jemand bitte erklären, was der Unterschied zwischen Anbieter und Instanzen ist?

Antwort

4

Eigentlich Ihre Frage gut ist. Um es sehr einfach zu machen, definieren wir Services in Angular JS, um unsere Funktionen zu erreichen. Provider ist eine der Möglichkeiten zu konfigurieren, wie diese Dienste funktionieren sollen. Es gibt einige weitere Konzepte, nämlich Werte, Konstanten, Factory, Service und Decorator in Angular JS, die uns helfen können, die Services auf verschiedene Arten abzufangen. Bitte überprüfen Sie den folgenden Link.

https://docs.angularjs.org/guide/providers

den Provider zurückzukommen, werden sie verwendet, Anwendung breite Konfigurationen zu definieren, die bereits vor Anwendung gestartet wird getan werden muss. Da Config-Blöcke ausgeführt werden, bevor die Angular JS-Module geladen werden, konfigurieren wir die Provider unter ihnen. Da die Module zu diesem Zeitpunkt nicht geladen worden sind, können Sie nicht auf Dienste innerhalb eines Konfigurationsblocks zugreifen.

Die Ausführungsblöcke werden ausgeführt, sobald alle Module vom $ Injector geladen wurden. Sobald Sie einen Laufblock betreten, dürfen Sie Ihren Provider nicht mehr konfigurieren, da Ihre Dienste ohnehin geladen werden. Aus diesem Grund können Sie innerhalb eines Ausführungsblocks nicht auf Provider zugreifen.

Lassen Sie uns ein Beispiel sehen. Ich habe meine Anwendung so gestaltet, dass sie sowohl Benutzer- als auch Admin-Bildschirme unterstützt. Aber die damit verbundenen Merkmale sind in ihren jeweiligen Diensten definiert. Ich möchte nur die entsprechenden Dienste laden, wenn sich ein Benutzer anmeldet. Das erreichen wir mit einem Provider wie unten beschrieben.

definieren rolesProvider

myApp.provider("roles", function rolesProvider(){ 
var role; 
this.setRole = function(value) { 
role = value; 
} 

this.$get = function rolesFactory() { 
if(role === "user") { 
return new userRole(); 
} else { 
return new adminRole(); 
} 
} 
}); 

konfigurieren rolesProvider als Benutzer

myApp.config(["rolesProvider"], function(rulesProvider){ 
rulesProvider.setRole("user"); 
}); 

Meine Anwendung als Benutzer ausführen konfiguriert werden und nicht als Administrator, wenn die Anwendung tritt weg.

Lassen Sie mich wissen, wenn Sie weitere Erklärungen benötigen.

+0

Danke ... Es hat mir geholfen zu verstehen. – RajSharma

+0

Gern geschehen. –

0

Gestohlen von diesem Beitrag: AngularJS: Service vs provider vs factory - definitiv lohnt sich das Lesen für ein besseres Verständnis der Rolle der verschiedenen Arten von Anbietern in eckigen.

Aber was, wenn wir die Greeter-Klasse vor der Injektion konfigurieren wollten? Dann könnten wir

Zum Beispiel schreiben:

provide.provider('greeter2', function() { 
    var salutation = 'Hello'; 
    this.setSalutation = function(s) { 
    salutation = s; 
} 

    function Greeter(a) { 
    this.greet = function() { 
     return salutation + ' ' + a; 
    } 
    } 

    this.$get = function(a) { //When injected into a controller or service, this is what will get called. 
    return new Greeter(a); 
    }; 
}); 

Dann können Sie die obige Konfiguration wie folgt:

angular.module('abc', []).config(function(greeter2Provider) { //Provider injected 
    greeter2Provider.setSalutation('Halo'); 
}); 

function Controller(greeter2) { //Accessing the actual service exposed by the provider.$get 
    expect(greeter2.greet()).toEqual('Halo 123'); 
} 
0

Schnelle Antwort: Provider erstellen eine Instanz. Bis dahin können Sie sie im config() Block verwenden. Sehr nützlich für einen Datenprovider, für den Sie beim Start die URL-Endpunkte ändern möchten.

Sie können jedoch einen Konfigurationscode im Abschnitt "Provider provider" ausführen, bevor new Something() ausgeführt wird.

Service-Service, Service-Factory und Service-Wert sind alle Verknüpfungen der Provider-Definition, aber die verbergen das Konfigurationsteil weg von Ihnen und nur direkt zur Instanziierung des Objekts (mit new Something()).