16

Sto cercando di realizzare una struttura di programma come questo:Come "caricare" un servizio in AngularJS? (Un'istanza prima del suo necessario, automaticamente)

enter image description here

Il problema qui è, quando non v'è alcun controller apparente uso delle funzioni del principio, non sono istanziati e non sono registrati nello FeatureRegistry, pertanto non possono essere visualizzati nella vista. Ma quello che vorrei ottenere è che vengano visualizzati nella vista, quindi il modello viene caricato tramite ng-include e quindi nel modello sono presenti controller specifici per ciascuna immagine. Questi controller sono quelli che utilizzano le funzionalità.

Le funzionalità sono fondamentalmente solo lì per raccontare la posizione di modelli e icone, che utilizzare, e anche per dare il via all'inizio della funzione.

Ma tornando alla mia domanda iniziale:
Come istanziare i servizi anche se non sono necessari al momento?

Oppure c'è un'altra funzione, che posso utilizzare per quello anziché per il servizio? Mi piacerebbe anche che tu me lo indicassi :)

risposta

21

Puoi richiederlo nella parte run della tua applicazione, l'iniettore lo invocherà.

angular.module("myApp", []). 
    factory("EagerService", function() { 
     console.log("I'm ready."); 
    }). 
    run(function (EagerService) { 
     console.log("EagerService is ready."); 
    }); 

Eppure, per quanto ho capito, si dispone di controller bambino/sub che hanno bisogno di questo EagerService. Perché non lo si inietta lì?

+0

Devono essere inclusi per primi, dal 'FeatureViewController'. Dovrebbe includere i modelli nella vista con i controller – JustGoscha

+0

Grazie btw, ha funzionato alla grande per ora! :) – JustGoscha

+0

Se si utilizza un pacchetto Web, è necessario disporre di almeno una riga di codice all'interno dell'esecuzione, perché il webpack non entra in funzione se non vi è alcun codice. Quindi, nel mio caso, uso 'return;' invece di 'console.log' – bora89

5

(Dato che questo è relativamente vecchio - questa risposta è per i futuri lettori - ma mi sono imbattuto in questa domanda così forse anche qualcun altro) Se usi provider/blocchi di configurazione - sono fatti avidamente, quindi è meglio fare desiderosi codice di inizializzazione lì. Probabilmente stai/stavi pensando in termini di servizi/blocchi di corsa.

Per dimostrare con il codice, questo avviso non si aprirà (supponendo myServiceModule è un modulo che l'applicazione dipende e myService non è iniettato da nessuna parte):

angular.module('myServiceModule', []).service('myService', function() { 
    alert("service"); 

    // service 
    return {}; 
}); 

Tuttavia questo avviso si aprirà anche se nessuno è in funzione del servizio di 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 {}; 
    }; 
}); 

È possibile vedere in azione in questo plunker.

Maggiori informazioni sui fornitori nella documentazione ufficiale here.