Je suis nouveau sur Angular. J'étudie le bloc de configuration et exécute le bloc de modules.

Veuillez consulter le code ci-dessous:

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

Comme vous pouvez le voir dans le bloc de configuration, il est écrit: "Vous ne pouvez injecter que des fournisseurs (pas des instances)".

Qu'est-ce que ça veut dire? Quelqu'un pourrait-il expliquer quelle est la différence entre le fournisseur et les instances?

5
RajSharma 9 août 2016 à 07:29

3 réponses

Meilleure réponse

En fait, votre question est bonne. Pour le rendre très simple, nous définissons des services dans Angular JS pour réaliser nos fonctionnalités. Le fournisseur est l'un des moyens de configurer le fonctionnement de ces services. Il existe d'autres concepts, à savoir Valeurs, Constantes, Usine, Service et Décorateur dans Angular JS, qui peuvent nous aider à intercepter les services de différentes manières. Veuillez vérifier le lien ci-dessous.

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

Pour en revenir aux fournisseurs, ils sont utilisés pour définir des configurations à l'échelle de l'application qui doivent être effectuées avant même le démarrage de l'application. Comme les blocs de configuration sont exécutés avant le chargement des modules Angular JS, nous configurons les fournisseurs sous eux. Étant donné que les modules n'auraient pas été chargés à ce moment-là, vous ne pouvez pas accéder aux services à l'intérieur d'un bloc de configuration.

Les blocs d'exécution sont exécutés une fois que tous les modules sont chargés par l'injecteur $. Une fois que vous entrez un bloc d'exécution, vous n'êtes plus autorisé à configurer votre fournisseur car vos services seront de toute façon chargés. C'est la raison pour laquelle vous ne pouvez pas accéder aux fournisseurs dans un bloc d'exécution.

Voyons un exemple. J'ai conçu mon application pour prendre en charge les écrans utilisateur et administrateur. Mais les fonctionnalités qui leur sont liées sont définies dans leurs services respectifs. Je souhaite charger uniquement les services appropriés lorsqu'un utilisateur se connecte. Nous réalisons cela en utilisant un fournisseur comme ci-dessous.

Définition des rôlesProvider

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

Configuration de rolesProvider en tant qu'utilisateur

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

Mon application sera configurée pour s'exécuter en tant qu'utilisateur plutôt qu'en tant qu'administrateur lorsque l'application démarre.

Faites-moi savoir si vous avez besoin de plus d'explications.

4
Vijayarajan Ravindran 10 août 2016 à 04:28

Réponse rapide: les fournisseurs créeront une instance. Jusqu'à ce qu'ils le fassent, vous pouvez les utiliser dans le bloc config (). Disons très utile pour un fournisseur de données que vous souhaitez modifier les points de terminaison d'URL au démarrage.

Mais vous pouvez exécuter du code de configuration dans la section "Fournisseur de fournisseur", avant l'exécution de new Something().

Service Service, Service Factory et Service Value sont tous des raccourcis de la définition du fournisseur, mais masquent la partie de configuration loin de vous et directement à l'instanciation de l'objet (en utilisant new Something()).

0
Dmitri R117 8 févr. 2017 à 20:35

Volé de cet article: AngularJS: service vs fournisseur vs usine - vaut vraiment la peine lire pour mieux comprendre le rôle des différents types de prestataires disponibles en angulaire.

Mais que faire si nous voulions configurer la classe Greeter avant l'injection? Ensuite, nous pourrions écrire

Par exemple:

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

Ensuite, vous pouvez configurer ce qui précède comme suit:

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
Community 23 mai 2017 à 12:32