2015-09-01 16 views
6

Desidero aggiungere dipendenze dopo che AngularJS è stato avviato. Ho provato a farlo tramite app.requires.push('app.main'); come suggerito in questo post (re-open and add dependencies to an already bootstrapped application). Comunque, non funziona.AngularJS aggiunge dipendenze dopo l'avvio

Ecco il mio codice di esempio:

index.html

<!DOCTYPE html> 
<html ng-app="app"> 

    <head> 
    <link rel="stylesheet" href="style.css"> 
    <script type="text/javascript" src="https://code.angularjs.org/1.4.3/angular.min.js"></script> 
    <script src="script.js"></script> 

    </head> 
    <body> 
    <h1>Hello Plunker!</h1> 
    </body> 

</html> 

script.js

var app = angular 
    .module('app',[]) 
    .run(function($http){ 
      $http.get("script2.js").success(function(data){ 
       eval(data); 
       //app.requires.push('app.main'); 
      }).error(function(){ 
       alert("error"); 
      }); 
    }); 

script2.js

alert("it's loaded"); 
angular.module('app.main', []) 
.run(function(){ 
    alert("it's running"); 
}); 
console.log(app); 
app.requires.push('app.main'); 

http://plnkr.co/edit/gN2kkoyqamB4OANXMUjA

Perché non funziona? Come posso ripararlo?

+0

perché pensi che questo non ha funzionato? http://plnkr.co/edit/T7B5t9KZTKGpSAfkJxsj?p=preview – lukkea

+0

@lukkea Se funziona, dovrebbe mostrare la casella di avviso 'sta correndo'. – user1995781

+0

il mio sospetto sarebbe che .run non si verifica quando si aggiunge tramite require.add (l'app è già stata eseguita quando si carica lo script); hai provato ad aggiungere un servizio a app.main e a chiamare quel servizio dall'app? (Mi rendo conto che potrebbe non essere adatta alla tua soluzione, ma almeno ti darebbe un'idea se app.main stia effettivamente caricando correttamente per l'uso dall'app. – lukkea

risposta

3

moduleName.requires non documentato, scarsamente compreso e used only by Angular injector. L'iniettore, a sua volta, viene chiamato durante il bootstrap (tramite ng-app o angular.bootstrap) o creando un nuovo iniettore con .

Dopo aver eseguito l'avvio dell'app e aver completato le fasi di configurazione/esecuzione, non è possibile richiamare nuovi blocchi di configurazione/esecuzione. Lo stesso vale per moduleName.directive, moduleName.controller e altri metodi di modulo, tutti dovrebbero essere chiamati prima che l'app venga riavviata. Quindi, non sono adatti a definire il modulo in modo asincrono.

Recentemente definito blocco conduzione può essere chiamato by creating an injector explicitly (e significa che viene creata una nuova istanza app):

var newApp = angular.injector(['app.main']); 

È uso primario è in test e ha un'applicazione limitata nella produzione - neo istanziata l'app ei suoi servizi non possono comunicare con l'app bootstrapped perché i singleton di servizio sono diversi.

Esistono alcune soluzioni per il caricamento lazy in Angular, il più completo è ocLazyLoad.