6

Ich möchte Abhängigkeiten hinzufügen, nachdem AngularJS Bootstrapped ist. Ich habe versucht, es über app.requires.push('app.main'); zu tun, wie in diesem Beitrag vorgeschlagen (re-open and add dependencies to an already bootstrapped application). Es funktioniert jedoch nicht.AngularJS hinzufügen Abhängigkeiten nach dem Bootstrapping

Hier ist mein Beispielcode:

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

Warum funktioniert es nicht? Wie kann ich es reparieren?

+0

warum glaubst du, das hat nicht funktioniert? http://plnkr.co/edit/T7B5t9KZTKGpSAfkJxsj?p=preview – lukkea

+0

@lukkea Wenn es funktioniert, sollte es zeigen, dass es "läuft" Alarm-Box. – user1995781

+0

mein Verdacht wäre, dass .run nicht passiert, wenn Sie über request.add hinzufügen (die App wurde bereits beim Laden des Skripts ausgeführt); haben Sie versucht, einen Dienst zu app.main hinzuzufügen und diesen Dienst von der App aus anzurufen? (Ich weiß, dass dies nicht zu Ihrer Lösung passt, aber es würde Ihnen zumindest eine Vorstellung davon geben, ob app.main tatsächlich korrekt für die Verwendung aus der App geladen wird. – lukkea

Antwort

3

moduleName.requires ist undokumentiert, schlecht verstanden und used only by Angular injector. Der Injektor wird seinerseits während des Bootstrappings (entweder über oder) aufgerufen oder erzeugt einen neuen Injektor mit angular.injector.

Sobald die App bootstrapped ist und die config/run-Phasen vorüber sind, können neue config/run-Blöcke nicht aufgerufen werden. Die gleichen Bedenken sind moduleName.directive, moduleName.controller und andere Modulmethoden, die alle aufgerufen werden sollten, bevor die App bootstrapped wird. Daher sind sie nicht zum asynchronen Definieren von Modulen geeignet.

Neu definierte Laufblock kannby creating an injector explicitly genannt werden (und es bedeutet, dass eine neue Anwendung Instanz erstellt wird):

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

Es ist primäre Verwendung testet, und es hat in der Produktion eine begrenzte Anwendung - die neu instanziiert Die App und ihre Dienste können nicht mit der Bootstrap-App kommunizieren, da Service-Singletons unterschiedlich sind.

Es gibt ein paar Lösungen für Lazy Loading in Angular, die umfassendste ist ocLazyLoad.