Ich habe eine Reihe von Angular-Modulen in meiner App deklariert. Ich habe ursprünglich damit begonnen, sie mit der "verketteten" Syntax wie folgt zu deklarieren:
angular.module('mymodule', [])
.controller('myctrl', ['dep1', function(dep1){ ... }])
.service('myservice', ['dep2', function(dep2){ ... }])
... // more here
Aber ich entschied, dass das nicht sehr einfach zu lesen war, und begann, sie mit einer Modulvariablen wie der folgenden zu deklarieren:
var mod = angular.module('mymodule', []);
mod.controller('myctrl', ['dep1', function(dep1){ ... }]);
mod.service('myservice', ['dep2', function(dep2){ ... }]);
...
Die zweite Syntax scheint mir viel besser lesbar zu sein, aber meine einzige Beschwerde ist, dass diese Syntax die mod
Variable im globalen Bereich auslässt. Wenn ich jemals eine andere Variable benannt habe mod
, wird diese mit der nächsten überschrieben (und anderen Problemen, die mit globalen Variablen verbunden sind).
Meine Frage ist also, ist das der beste Weg? Oder wäre es besser, so etwas zu tun?:
(function(){
var mod = angular.module('mymod', []);
mod.controller('myctrl', ['dep1', function(dep1){ ... }]);
mod.service('myservice', ['dep2', function(dep2){ ... }]);
...
})();
Oder ist es überhaupt wichtig genug, sich darum zu kümmern? Ich bin nur neugierig zu wissen, was die "Best Practices" für die Moduldeklaration sind. Danke im Voraus.
Antworten:
'Beste' Möglichkeit, ein Modul zu deklarieren
Da Angular im globalen Bereich selbst liegt und Module in seiner Variablen gespeichert werden, können Sie auf Module zugreifen über
angular.module('mymod')
:Es sind keine weiteren globalen Variablen erforderlich.
Natürlich hängt alles von den Vorlieben ab, aber ich denke, dies ist eine Art Best Practice
Optionen zum Sortieren Ihrer Module und Dateien
Diese Art der Deklaration und des Zugriffs auf Module macht Sie sehr flexibel. Sie können Module nach Funktionstyp (wie in einer anderen Antwort beschrieben) oder nach Route sortieren, z.
Wie Sie es am Ende sortieren, hängt vom persönlichen Geschmack sowie vom Umfang und der Art des Projekts ab. Ich persönlich mag es, alle Dateien eines Moduls in demselben Ordner zu gruppieren (in Unterordnern von Anweisungen, Controllern, Diensten und Filtern angeordnet), einschließlich aller verschiedenen Testdateien, da Ihre Module dadurch wiederverwendbarer werden. So habe ich in mittelgroßen Projekten ein Basismodul, das alle grundlegenden Routen und ihre Controller, Dienste, Anweisungen und mehr oder weniger komplexen Untermodule enthält, wenn ich denke, dass sie auch für andere Projekte nützlich sein könnten, z ::
Bei sehr großen Projekten gruppiere ich Module manchmal nach Routen, wie oben beschrieben, oder nach ausgewählten Hauptrouten oder sogar nach einer Kombination von Routen und einigen ausgewählten Komponenten, aber das hängt wirklich davon ab.
EDIT: Nur weil es verwandt ist und ich kürzlich wieder darauf gestoßen bin: Achten Sie darauf, dass Sie ein Modul nur einmal erstellen (indem Sie der angular.module-Funktion einen zweiten Parameter hinzufügen). Dies wird Ihre Anwendung durcheinander bringen und kann sehr schwer zu erkennen sein.
2015 EDIT zum Sortieren von Modulen: Eineinhalb Jahre Erfahrung mit Winkeln später kann ich hinzufügen, dass die Vorteile der Verwendung von Modulen mit unterschiedlichen Namen in Ihrer App etwas begrenzt sind, da AMD mit Angular und Diensten, Anweisungen und Filtern immer noch nicht wirklich gut funktioniert sind ohnehin global im Winkelkontext verfügbar ( wie hier beispielhaft dargestellt ). Es gibt jedoch immer noch einen semantischen und strukturellen Vorteil, und es kann hilfreich sein, ein Modul mit einer einzelnen Codezeile ein- oder auszuschließen, die ein- oder ausgekommentiert wird.
Es ist auch fast nie sinnvoll, Untermodule nach Typ zu trennen (z. B. 'myMapSubModule.controllers'), da sie normalerweise voneinander abhängen.
quelle
'use strict';
in Ihre Komponente einfügen.module.controller(function () { 'use strict'; ... });
Ich liebe den Angular -Styleguide von Johnpapa, und hier sind einige Regeln, die sich auf diese Frage beziehen:
Regel: Benannte vs Anonyme Funktionen
Vermeiden Sie anonyme Funktionen:
Verwenden Sie stattdessen benannte Funktionen:
Wie der Autor sagt:
This produces more readable code, is much easier to debug, and reduces the amount of nested callback code.
Regel: Definieren Sie 1 Komponente pro Datei.
Vermeiden Sie mehrere Komponenten in einer Datei:
Verwenden Sie eine Datei, um das Modul zu definieren:
Eine Datei verwendet nur das Modul, um eine Komponente zu definieren
und eine andere Datei, um eine andere Komponente zu definieren
Natürlich gibt es viele andere Regeln für Module, Controller und Dienste, die sehr nützlich und lesenswert sind.
Und dank des Kommentars von ya_dimon sollte der obige Code in IIFE eingeschlossen werden, zum Beispiel:
quelle
Ich hatte vor kurzem auch dieses Rätsel. Ich hatte genau wie Sie mit der verketteten Syntax angefangen, aber auf lange Sicht wird es bei großen Projekten unhandlich. Normalerweise würde ich ein Controller-Modul, ein Servicemodul usw. in separaten Dateien erstellen und sie in mein Hauptanwendungsmodul einfügen, das sich in einer anderen Datei befindet. Beispielsweise:
Aber jede dieser Dateien wurde mit dem Wachstum des Projekts viel zu groß. Deshalb habe ich beschlossen, sie je nach Controller oder Dienst in separate Dateien aufzuteilen. Ich fand, dass die Verwendung
angular.module('mod-name').
ohne das Injektionsarray das ist, was Sie brauchen, damit dies funktioniert. Das Deklarieren einer globalen Variablen in einer Datei und das Erwarten, dass diese in einer anderen Datei verfügbar ist, funktioniert einfach nicht oder kann zu unerwarteten Ergebnissen führen.Kurz gesagt, meine Bewerbung sah ungefähr so aus:
Ich habe dies auch für die Servicedatei getan. Es ist nicht erforderlich, die Hauptanwendungsmoduldatei zu ändern, in die Sie immer noch dieselben Module einfügen würden.
quelle
angular.module('my-controllers',[]);
(Beachten Sie, dass er das [] nur einmal für die Deklaration angibt). Er verwendet dies einfach in den anderen Dateien wieder. Die Trennung von Dateien macht es relativ einfach, das Projekt zu pflegen, insbesondere große.Eine andere Praxis besteht darin, Controller, Direktiven usw. in ihre eigenen Module zu packen und diese Module in Ihr "Haupt" -Modul einzufügen:
Im globalen Bereich bleibt nichts übrig.
http://plnkr.co/edit/EtzzPRyxWT1MkhK7KcLo?p=preview
quelle
app.controllers
instedcontrollers
als Modulnamen. Gibt es einen Vorteil? Ich bin ein Neuling in AngularjsIch teile gerne meine Dateien und meine Module.
Etwas wie das:
app.js.
directives.js
service.js
Ich bin kein großer Fan des "verketteten Stils", deshalb schreibe ich meine Variable immer lieber auf.
quelle
Ich schlage vor, Angularjs Style Guide zu folgen .
Sie behandeln alle Konzepte von der Namenskonvention bis zur Modularisierung Ihrer App und so weiter.
Für Angular 2 können Sie Angular 2 Style Guide überprüfen
quelle
Verkettung ist für mich der kompakteste Weg:
Auf diese Weise kann ich problemlos Komponenten zwischen Modulen verschieben, muss nie dasselbe Modul zweimal deklarieren und benötige niemals globale Variablen.
Und wenn die Datei zu lang wird, ist die Lösung einfach - aufgeteilt in zwei Dateien, von denen jede oben ihr eigenes Modul deklariert. Für mehr Transparenz versuche ich, ein eindeutiges Modul pro Datei beizubehalten und es so zu benennen, dass es dem vollständigen Pfad der Datei ähnelt. Auf diese Weise muss ich auch nie ein Modul ohne schreiben
[]
, was ein häufiger Schmerzpunkt ist.quelle