Angular JS: pourquoi la différence entre le module.config d'injection et de contrôleur de l'injection?
C'est quelque chose que je ne pouvais pas comprendre de creuser dans le code AngularJS, peut-être vous pouvez aider à résoudre le mystère.
Pour le montrer, j'ai ajouté un service AngularJS projet de semences:
function MyServiceProvider() {
console.log('its my service');
this.providerMethod = providerMethod;
function providerMethod() {
console.log('its my service.providerMethod');
}
this.$get = $get;
function $get() {
var innerInjectable = {
name: 'stam'
};
return innerInjectable;
}
}
var serviceModule = angular.module('myApp.services', []).
value('version', '0.1').
provider('myservice',MyServiceProvider);
Vous pouvez voir que ce fournisseur expose $get et un certain "providerMethod'.
Maintenant, pour l'injection d'utilisation:
Si nous appelons de config, on peut injecter de l'ensemble de la classe et d'avoir accès à 'l'extérieur' fournisseur méthode:
serviceModule.config(function(myserviceProvider) {
console.log('myServiceProvider:',myserviceProvider);
myserviceProvider.providerMethod();
});
Mais quand nous injecter à un contrôleur (notez le Fournisseur moins de nom), seul le $obtenez la valeur de retour est exposée:
function MyCtrl1(myservice) {
console.log('MyCtrl1.myservice =',myservice,myservice.name);
}
MyCtrl1.$inject = ['myservice'];
Sortie de la Console suit comme il se doit:
son mon service
myServiceProvider:
Constructeur {providerMethod: la fonction, $get: function}
son mon service.providerMethod
MyCtrl1.myservice = Objet {nom: "stam"} stam
Peut-on expliquer la différence? La raison?
merci beaucoup pour toute pensée
Lior
PS: j'ai vu cette technique dans angular-ui nouveau ui-router (excellent projet!). J'ai besoin d'accéder à l'extérieur fournisseur de classe pour faire de l'injection de jasmin et d'autres endroits - en vain
- double possible de Service vs fournisseur vs usine?
Vous devez vous connecter pour publier un commentaire.
Un fournisseur est responsable de la création des instances. Dans votre exemple, vous avez créé un fournisseur explicitement, mais la vérité est que chaque service a un fournisseur, même si il est créé automatiquement pour elle.
[module].service()
et[module].factory()
sont juste des raccourcis pour[module].provider()
.[module].config()
est exécuté lors du fournisseur d'enregistrements et de configurations afin de vous obtenir un changement de fournisseurs d'accès et de faire des trucs avec eux. C'est un endroit pour la configuration des choses, d'où le nom.À partir de la documentation (http://docs.angularjs.org/guide/module):
Contrôleurs, en revanche, sont instanciés APRÈS que les services aient été configuré, vous n'êtes pas censé le désordre avec des fournisseurs de plus. Tout a déjà été configuré. Vous êtes prêt à obtenir leurs produits maintenant. Dans cette phase, l'injecteur ne pouvez pas injecter des fournisseurs de plus, juste au cas (services) créé par eux.
Si vous vous inscrivez à un service
myService
...ensuite, vous pouvez accéder à son fournisseur,
myServiceProvider
, dans une fonction config...mais par le temps, les contrôleurs sont instanciés, vous êtes censé demander des services, de leurs fournisseurs, de sorte que cela ne fonctionnera pas...
alors que ce sera bien...
Si vous êtes de trouver vous-même avoir à faire dans la configuration d'un contrôleur, vous devez arrêter et de repenser la place de responsabilités.
De l'angle de la liste de diffusion, j'ai eu une incroyable fil qui explique le service vs usine vs fournisseur et leur injection d'utilisation. J'ai décidé de le mettre dans sa propre question ici
la réponse est: il est donc, de par sa conception, pour permettre la configuration du fournisseur au temps de configuration.