use $ http dentro do provedor personalizado na configuração do aplicativo, angular.js

A questão principal – é possível? Eu tentei sem sorte ..

principal app.js

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

provedor em si

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

E eu tenho esse erro:

 Uncaught Error: Unknown provider: $http from services 

Alguma ideia?

Obrigado!

A linha inferior é:

  • Você NÃO pode injetar um serviço na seção de configuração do provedor .
  • Você pode injetar um serviço na seção que inicializa o serviço do provedor .

Detalhes:

Estrutura angular tem um processo de boot de 2 fases:

FASE 1: Config

Durante a fase de config , todos os provedores são inicializados e todas as seções de config são executadas. As seções de config podem conter código que configura os objects do provedor e, portanto, podem ser injetados com objects do provedor. No entanto, como os provedores são as fábricas para os objects de serviço e nesse estágio os provedores não estão totalmente inicializados / configurados -> você não pode pedir ao provedor para criar um serviço para você neste estágio -> na fase de configuração você não pode usar / injetar serviços . Quando essa fase é concluída, todos os provedores estão prontos (nenhuma configuração de provedor mais pode ser feita após a conclusão da fase de configuração).

FASE 2: Executar

Durante a fase de run , todas as seções de run são executadas. Neste estágio, os provedores estão prontos e podem criar serviços -> durante a fase de run , você pode usar / injetar serviços .

Exemplos:

1. Injetando o serviço $http para a function de boot do provedor não funcionará

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

Como estamos tentando injetar o serviço $http em uma function que é executada durante a fase de config , obteremos um erro:

 Uncaught Error: Unknown provider: $http from services 

O que este erro está realmente dizendo é que o $httpProvider que é usado para criar o serviço $http ainda não está pronto (já que ainda estamos na fase de config ).

2. Injetando o serviço $http para a function de boot do serviço funcionará:

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

Como agora estamos injetando o serviço na function de boot do serviço, que é executada durante a fase de run , esse código funcionará.

Isso pode lhe dar um pouco de alavancagem:

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

Mas tenha cuidado, os callbacks de sucesso / erro podem mantê-lo em uma condição de corrida entre o início do aplicativo e a resposta do servidor.

Esta é uma pergunta antiga, parece que temos alguma coisa de ovo de galinha acontecendo se quisermos confiar na capacidade principal da biblioteca.

Em vez de resolver o problema de maneira fundamental, o que fiz foi bypass. Crie uma diretiva que envolva todo o corpo. Ex.

  
Hello World

Agora mc-body precisa ser inicializado antes de renderizar (uma vez), ex.

 link: function(scope, element, attrs) { Auth.login().then() ... } 

Auth é um serviço ou provedor, ex.

 .provider('Auth', function() { ... keep your auth configurations return { $get: function($http) { return { login: function() { ... do something about the http } } } } }) 

Parece-me que eu tenho controle sobre a ordem do bootstrap, é depois que o bootstrap regular resolve toda a configuração do provedor e então tenta inicializar mc-body diretiva mc-body .

E esta directiva parece-me pode estar à frente do roteamento, porque o roteamento também é injetado através de uma diretiva ex. . Mas eu posso estar errado nisso. Precisa de mais alguma investigação.

Em resposta à sua pergunta, “Any Ideas?”, Eu teria respondido com “yes”. Mas espere, tem mais!

Eu sugiro apenas usando o JQuery na configuração. Por exemplo:

 var app = angular.module('myApp', ['services']); app.config(['$anyProvider', function ($anyProvider) { $.ajax({ url: 'www.something.com/api/lolol', success: function (result) { $anyProvider.doSomething(result); } }); }]); 
Intereting Posts