90 votes

utiliser $http à l'intérieur de fournisseurs personnalisés en application de config, angular.js

La principale question - est-il possible? J'ai essayé avec pas de chance..

principal app.js

...
var app = angular.module('myApp', ['services']);
app.config(['customProvider', function (customProvider) {

}]);
...

fournisseur lui-même

var services = angular.module('services', []);
services.provider('custom', function ($http) {
});

Et j'ai cette erreur:

Uncaught Error: Unknown provider: $http from services 

Des idées?

Merci!

158voto

Dana Shalev Points 713

La ligne de fond est:

  • Vous NE peut pas injecter un service dans la configuration de fournisseur de l'article.
  • Vous POUVEZ injecter un service dans la section qui initialise le fournisseur de service.

Détails:

Angulaire du cadre a de la phase 2 du processus d'initialisation:

PHASE 1: Config

Au cours de l' config de phase de tous les fournisseurs sont initialisés et tous les de la config sections sont exécutées. L' config articles peuvent contenir du code qui configure les objets du fournisseur et, par conséquent, ils peuvent être injectés avec des objets du fournisseur. Toutefois, étant donné que les fournisseurs sont les usines pour les objets de service et, à ce stade, les fournisseurs ne sont pas entièrement initialisé/configuration -> on ne peut pas demander au fournisseur de créer un service pour vous à ce stade -> à l'étape de configuration vous ne pouvez pas utiliser/injecter des services. Lorsque cette phase est terminée, tous les fournisseurs de prêt (pas de configuration du fournisseur qui peut être fait après la phase de configuration est terminé).

PHASE 2: Exécuter

Au cours run de phase tout l' run sections sont exécutées. À ce stade, les fournisseurs sont prêts et peuvent créer des services -> pendant run phase, vous pouvez utiliser/injecter des services.

Exemples:

1. L'injection de l' $http service pour le fournisseur de la fonction d'initialisation ne SERA PAS de travail

angular.module('myModule').provider('myProvider', function($http) {
    // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
    ...

    this.$get = function() {
        // code to initialize/configure the SERVICE goes here (executed during `run` stage)

        return myService;
    };
});

Depuis que nous essayons d'injecter de l' $http de service dans une fonction qui est exécutée lors de l' config phase, nous avons un message d'erreur:

Uncaught Error: Unknown provider: $http from services 

Ce que cette erreur est en train de dire, c'est que l' $httpProvider qui est utilisé pour créer l' $http service n'est pas encore prêt (puisque nous sommes encore dans l' config de phase).

2. L'injection de l' $http service pour le service de l'initialisation de la fonction VA travailler:

angular.module('myModule').provider('myProvider', function() {
    // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
    ...

    this.$get = function($http) {
        // code to initialize/configure the SERVICE goes here (executed during `run` stage)

        return myService;
    };
});

Puisque nous sommes maintenant de l'injection de service dans le service à la fonction d'initialisation, qui est exécutée lors de l' run phase de ce code fonctionne.

63voto

Cody Points 1198

Cela pourrait vous donner un peu d'effet de levier:

var initInjector = angular.injector(['ng']);
var $http = initInjector.get('$http');

Mais attention, le succès ou l'erreur des rappels de mon garde dans une course-condition entre l'application de début et de la réponse du serveur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X