Gibt es eine Möglichkeit, eine späte Abhängigkeit in ein bereits gebootetes Winkelmodul einzufügen? Folgendes meine ich:
Angenommen, ich habe eine Website-weite Winkel-App, definiert als:
// in app.js
var App = angular.module("App", []);
Und auf jeder Seite:
<html ng-app="App">
Später öffne ich die App erneut, um Logik hinzuzufügen, die auf den Anforderungen der aktuellen Seite basiert:
// in reports.js
var App = angular.module("App")
App.controller("ReportsController", ['$scope', function($scope) {
// .. reports controller code
}])
Nun, sagen , dass einer dieser On-Demand - Bits der Logik auch ihre eigenen Abhängigkeiten erfordert (wie ngTouch
, ngAnimate
, ngResource
usw.). Wie kann ich sie an die Basis-App anhängen? Das scheint nicht zu funktionieren:
// in reports.js
var App = angular.module("App", ['ui.event', 'ngResource']); // <-- raise error when App was already bootstrapped
Mir ist klar, dass ich alles im Voraus tun kann, dh -
// in app.js
var App = angular.module("App", ['ui.event', 'ngResource', 'ngAnimate', ...]);
Oder definieren Sie jedes Modul für sich und fügen Sie dann alles in die Haupt-App ein ( siehe hier für weitere Informationen ):
// in reports.js
angular.module("Reports", ['ui.event', 'ngResource'])
.controller("ReportsController", ['$scope', function($scope) {
// .. reports controller code
}])
// in home.js
angular.module("Home", ['ngAnimate'])
.controller("HomeController", ['$scope', '$http', function($scope, $http){
// ...
}])
// in app.js, loaded last into the page (different for every page that varies in dependencies)
var App = angular.module("App", ['Reports', 'Home'])
Dafür muss ich die App jedoch jedes Mal mit den Abhängigkeiten der aktuellen Seite initialisieren.
Ich ziehe den Grund enthalten app.js
in jeder Seite und einfach einzuführen , um die erforderlichen Erweiterungen auf jeder Seite ( reports.js
, home.js
usw.), ohne dass die Bootstrap - Logik jedes Mal zu überarbeiten, die ich hinzufügen oder entfernen etwas.
Gibt es eine Möglichkeit, Abhängigkeiten einzuführen, wenn die App bereits gebootet ist? Was ist der idiomatische Weg (oder die idiomatischen Wege), dies zu tun? Ich neige zu letzterer Lösung, wollte aber sehen, ob die von mir beschriebene Vorgehensweise auch möglich ist. Vielen Dank.
Antworten:
Ich habe es so gelöst:
Verweisen Sie erneut auf die App:
Verschieben Sie dann Ihre neuen Anforderungen in das Anforderungsarray:
quelle
app.requires
ist ein Array. Wenn Sie also mehrere Abhängigkeiten hinzufügen (wie in Ihrem Berichtsbeispiel), übergeben Sie diese als separate Argumente an diepush
Methode:app.requires.push('ui.event', 'ngResource');
oder wenn Ihre zusätzlichen Abhängigkeiten bereits ein Array sind:Array.prototype.push.apply(app.requires, ['ui.event', 'ngResource'])
Einfach ... Holen Sie sich eine Instanz des Moduls mit dem Getter wie folgt: var app = angular.module ("App");
Fügen Sie dann der Sammlung "require" Folgendes hinzu: app.requires [app.requires.length] = "ngResource";
Jedenfalls hat das bei mir funktioniert. VIEL GLÜCK!
quelle
Nach diesem Vorschlag in der Google-Gruppe Angular JS ist diese Funktionalität derzeit nicht verfügbar. Hoffentlich beschließt das Kernteam, diese Funktionalität hinzuzufügen, könnte sie selbst verwenden.
quelle
Wenn Sie mehrere Abhängigkeiten gleichzeitig hinzufügen möchten, können Sie diese wie folgt per Push übergeben:
quelle
Mir ist klar, dass dies eine alte Frage ist, es wurde jedoch noch keine funktionierende Antwort gegeben. Deshalb habe ich beschlossen, mitzuteilen, wie ich sie gelöst habe.
Die Lösung erfordert das Gabeln von Angular, sodass Sie CDN nicht mehr verwenden können. Die Modifikation ist jedoch sehr klein, daher bin ich überrascht, warum diese Funktion in Angular nicht vorhanden ist.
Ich folgte dem Link zu Google-Gruppen , der in einer der anderen Antworten auf diese Frage angegeben war. Dort fand ich den folgenden Code, der das Problem löste:
Als ich diesen Code in Zeile 4414 im eckigen 1.5.0-Quellcode (innerhalb der
createInjector
Funktion vor derreturn instanceInjector;
Anweisung) hinzufügte, konnte ich nach diesem Bootstrapping Abhängigkeiten hinzufügen$injector.loadNewModules(['ngCookies']);
.quelle
Seit Version 1.6.7 ist es nun möglich, Module verzögert zu laden, nachdem die App mit gebootet wurde
$injector.loadNewModules([modules])
. Unten finden Sie ein Beispiel aus der AngularJS-Dokumentation:Bitte lesen Sie die vollständige Dokumentation zu loadNewModules, da es einige Fallstricke gibt.
Es gibt auch eine sehr gute Beispiel-App von Omkadiri , die sie mit dem UI -Router verwendet.
quelle