Von einer Feature-Anfrage habe ich für inclusion of an AMD loader als Teil der zusätzlichen ng-Module.
Angular verfügt über eine Funktion, mit der Benutzer Moduldefinitionen erstellen und Entitäten wie Controller später anhand einer String-ID suchen können. Angular bietet keine Möglichkeit, Skripte in einer separaten Datei zu laden, was bedeutet, dass Sie vier Optionen haben:
Speichern Sie alle Ihre Javascript in einer einzigen Datei.
Trennen Sie Ihr Javascript in separate Dateien und fügen Sie Skript-Tags für jede Datei hinzu.
Verwenden Sie einen AMD File Loader wie requireJS, um Skriptdateien und ihre Abhängigkeiten zu verwalten.
Verwenden Sie einen Precompiler wie browserify, um nodejs-Stildateien in einer einzigen Skriptdatei zusammenzuführen.
Wenn ein Projekt wächst, werden die Dateien schwieriger zu verwalten, nicht nur wegen ihrer Größe, sondern weil die Abhängigkeiten zwischen Modulen komplizierter werden. Große Projekte können auch vom langsamen Laden eines AMD-Laders profitieren.
Ein AMD-Modulladeprogramm listet die Abhängigkeiten auf, die vorhanden sein müssen, bevor diese Datei ausgeführt werden kann. Das Problem ist, dass AMD-Abhängigkeiten nahe an der von Angular verwendeten Injection-Liste liegen, aber nicht genau die gleiche Sache. Ein Problem kann in diesem Code zu sehen:
define(['angular'], function(angular) {
return angular.module('myApp.controllers', ['myApp.services'])
.controller('MyController', ['$scope', 'myService',
function($scope, myService) {
$scope.data = myService.getData();
}
])
};
Die Aussage definieren an der Spitze sagt, um sicherzustellen, dass angular
vor dem Ausführen dieser Funktion initialisiert wird. Die Anweisung angular.module
besagt, dass '$ scope' und 'myService' gesucht und in die Variablen $scope
und myService
injiziert werden sollen. Das Problem ist, dass der AMD Loader die Datei, die myApp.services
definiert, möglicherweise nicht initialisiert hat, in der Sie annehmen können, dass myService
definiert ist, da es in der obigen Definition nicht angezeigt wurde. Dies erzeugt eine große Trennung zwischen der Injektionsliste und der AMD-Abhängigkeitsliste. Es ist nicht nur schwierig zu sagen, ob 'myApp.Dienstleistungen; geladen wurde, ist es auch schwierig zu sagen, welche speziellen Komponenten in 'myApp.services' verfügbar sind. IOW Ist 'myService' sowohl geladen als auch injizierbar?
Ich verwende derzeit die Option # 3 in Form von require, weil ich die Fähigkeit haben muss, Controller dynamisch über Routing zu laden (siehe ersten Link). Auch die Größe der Anwendung, mit der ich arbeite, macht browserfy unpraktisch, da es so viele Seiten gibt. Ich stimme jedoch zu, dass dies suboptimal ist, aber ich sehe im Moment keine andere Wahl.
Aus praktischen Gründen definiere ich eine injizierbare pro Datei. Ich versuche auch, dass alle injizierbaren Arrays mit dem require-Array übereinstimmen. Dies ist nicht notwendig, aber es macht den Code wartungsfreundlicher.
fand ich diese Artikel hilfreich diese in schriftlicher Form:
https://github.com/marcoslin/angularAMD
http://weblogs.asp.net/dwahlin/archive/2013/05/22/dynamically-loading-controllers-and-views-with-angularjs-and-requirejs.aspx
Ich würde eher zustimmen, dass es keinen Sinn macht, für Angular erforderlich zu verwenden. – Polaris878
Ich dachte, das Gleiche zu tun, da sowohl requirejs als auch browserify mehr Overhead bei der Entwicklung mit angular.js hinzufügen würden. –
Ich habe eine offene Feature-Anfrage, die etwas an Fahrt zu gewinnen scheint: https://github.com/angular/angular.js/issues/5410 Meine Aufschreibung auf mögliche Lösung: https://github.com/NathanielAJohnson/angularAMD/ wiki/Proposed-Solution –