¿Cómo “cargar ansiosamente” un servicio en AngularJS?(instanciarlo antes de que sea necesario, automáticamente)
lazy-loading lazy-initialization (2)
Estoy tratando de lograr una estructura de programa como esta:
El problema aquí es que cuando no hay un controlador aparente que use las Características al principio, no se FeatureRegistry
instancia ni se registra en el FeatureRegistry
, por lo que no pueden aparecer en la Vista. Pero lo que me gustaría lograr es que se muestren en la vista, luego la plantilla se cargue a través de ng-include
y luego en la plantilla hay controladores específicos para cada característica. Estos controladores son los que están utilizando las características.
Básicamente, las funciones solo están allí para informar sobre la ubicación de las plantillas e íconos que se deben utilizar y también para iniciar el inicio de la Función.
Pero volvamos a mi pregunta inicial:
¿Cómo instanciar los servicios incluso si no son necesarios en este momento?
¿O hay otra función que puedo usar para eso en lugar del servicio? También me gustaría si me señala a eso entonces :)
(Dado que esto es relativamente antiguo, esta respuesta es para futuros lectores, pero me topé con esta pregunta, así que tal vez alguien más también lo haga) Si utiliza los bloques de configuración / proveedores: se realizan con entusiasmo, por lo que es mejor hacer un código de inicialización impaciente allí. Probablemente estás pensando en términos de servicios / bloques de ejecución.
Para demostrar con el código, esta alerta no se abrirá (asumiendo que myServiceModule
es un módulo del que depende su aplicación y myService
no se inyecta en ninguna parte):
angular.module(''myServiceModule'', []).service(''myService'', function () {
alert("service");
// service
return {};
});
Sin embargo, esta alerta se abrirá incluso si nadie depende del servicio myProvider
:
angular.module(''myProviderModule'', []).provider(''myProvider'', function () {
alert("provider");
// Define your service here. Can be an array of inject-ables
// instead of a function.
this.$get = function () {
// service
return {};
};
});
Puedes ver esto en acción en este plunker .
Lea más sobre proveedores en la documentación oficial here .
Puede solicitarlo en la parte de run
de su aplicación, el inyector lo invocará.
angular.module("myApp", []).
factory("EagerService", function () {
console.log("I''m ready.");
}).
run(function (EagerService) {
console.log("EagerService is ready.");
});
Sin embargo, por lo que tengo entendido, usted tiene controladores secundarios / secundarios que necesitan este EagerService
. ¿Por qué no lo inyectas allí?