La pregunta principal: ¿es posible? Lo intenté sin suerte ..
app.js principal
...
var app = angular.module('myApp', ['services']);
app.config(['customProvider', function (customProvider) {
}]);
...
propio proveedor
var services = angular.module('services', []);
services.provider('custom', function ($http) {
});
Y tengo tal error:
Uncaught Error: Unknown provider: $http from services
¿Algunas ideas?
¡Gracias!
javascript
angularjs
angular-services
Kosmetika
fuente
fuente
app.config
parteRespuestas:
La conclusión es:
Detalles:
El marco angular tiene un proceso de inicialización de 2 fases:
FASE 1: Configuración
Durante la
config
fase, todos los proveedores se inicializan y todas lasconfig
secciones se ejecutan. Lasconfig
secciones pueden contener código que configura los objetos del proveedor y, por lo tanto, se pueden inyectar con los objetos del proveedor. Sin embargo, dado que los proveedores son las fábricas de los objetos de servicio y en esta etapa los proveedores no están completamente inicializados / configurados -> no puede pedirle al proveedor que cree un servicio para usted en esta etapa -> en la etapa de configuración no puede usar / servicios de inyección . Cuando se completa esta fase, todos los proveedores están listos (no se pueden realizar más configuraciones de proveedores una vez completada la fase de configuración).FASE 2: Ejecutar
Durante la
run
faserun
se ejecutan todas las secciones. En esta etapa, los proveedores están listos y pueden crear servicios -> durante larun
fase puede usar / inyectar servicios .Ejemplos:
1. La inyección del
$http
servicio a la función de inicialización del proveedor NO funcionaráComo estamos intentando inyectar el
$http
servicio en una función que se ejecuta durante laconfig
fase, obtendremos un error:Lo que realmente dice este error es que el
$httpProvider
que se usa para crear el$http
servicio aún no está listo (ya que todavía estamos en laconfig
fase).2. Inyectar el
$http
servicio a la función de inicialización del servicio FUNCIONARÁ :Dado que ahora estamos inyectando el servicio en la función de inicialización del servicio, que se ejecuta durante la
run
fase, este código funcionará.fuente
<script>var config = <% = mySettings.toJson() %>;</script>
). Esto se puede hacer usando un motor de plantillas como Smarty para PHP, Jinja2 para Python, Nunchucks para NodeJS, etc.Esto podría darle un pequeño apalancamiento:
Pero tenga cuidado, las devoluciones de llamada de éxito / error pueden mantenerlo en una condición de carrera entre el inicio de la aplicación y la respuesta del servidor.
fuente
angular.injector(['mymodule'])
, pero no estoy seguro de que pueda utilizar este enfoque para el$http
servicio. Aunque quiero decir que sí. No estoy seguro de si esto ayuda o no: - /Esta es una vieja pregunta, parece que tenemos algo de huevo de gallina si queremos confiar en la capacidad central de la biblioteca.
En lugar de resolver el problema de manera fundamental, lo que hice fue pasar por alto. Crea una directiva que envuelva todo el cuerpo. Ex.
Ahora
mc-body
debe inicializarse antes de renderizar (una vez), ej.Auth
es un servicio o proveedor, ej.Me parece que tengo el control sobre el orden del bootstrap, es después de que el bootstrap normal resuelve toda la configuración del proveedor y luego intento inicializar la
mc-body
directiva.Y esta directiva me parece que puede estar por delante del enrutamiento, porque el enrutamiento también se inyecta a través de una directiva ex.
<ui-route />
. Pero puedo equivocarme en esto. Necesita más investigación.fuente
En respuesta a su pregunta, "¿Alguna idea?", Habría respondido con "sí". ¡Pero espera hay mas!
Sugiero usar JQuery en la configuración. Por ejemplo:
fuente