Erstellen Sie dynamische Routen mit AngularJS ngRoute

NotizUm dieses Tutorial durchzuführen, ist es ratsam, eine klare Grundlage zu haben AngularJS, da wir auf einige technische Aspekte dieser Technologie nicht näher eingehen.

Während wir wissen, AngularJS Es bietet uns eine große Anzahl von Modulen, Diensten und Filtern, die sich bei der Erstellung einer Web- oder Mobilanwendung für heute als nützlich erweisen. Es gibt andere Module, die wir im Kern dieses Frameworks nicht finden können, eines davon ist ngRoute. Dieses Modul hat die Funktion, benutzerfreundliche URLs zu verwenden, indem es ihm einen Controller und ein Template zuweist, das automatisch über Ajax aufgerufen wird.

Weitere Informationen zu ngRoute:

Verwenden von ngRoute

Zuerst erstellen wir unser Projektverzeichnis, wir nennen es routeapp, innerhalb dieses Verzeichnisses erstellen wir ein weiteres namens public, in public erstellen wir eine index.html-Datei. Nun erstellen wir innerhalb von public ein Verzeichnis namens js, in dem wir unsere Angular-Dateien ablegen. In js beginnen wir, zwei erste Dateien namens app.js und controller.js zu platzieren

Alle aktuellen Versionen von anglejs erhalten Sie unter diesem Link: https://code.angularjs.org/. Um das Tutorial zu verwenden, verwenden wir Version 1.5.5 https://code.angularjs.org/1.5.5/
Index.html-Code

 Dynamische Ng-Route 
App.js-Code
 angle.module ('routeapp', ['ngRoute', 'routeapp.controller']);
Controller.js-Code
 angle.module ('routeapp.controller', []) .controller ('MainController', function () {console.log ('AngularJS');});
Jetzt führen wir dies auf einem Webserver aus. Sie können verwenden, was Sie möchten, sei es Apache, nginx, Tomcat usw. Für meinen Fall werde ich Express von nodejs verwenden. Wenn Sie dies auch mit nodejs tun möchten, können Sie die folgenden Schritte ausführen. Wenn Sie noch nie nodejs verwendet haben, können Sie dem folgenden Tutorial folgen, in dem es erklärt wird:
  • Erstellen Sie eine Frontend-Architektur mit npm, bower und grunt.

Wir verwenden den folgenden Befehl im Stammverzeichnis des Projekts von der Befehlszeile aus.

 npm ini
 npm install --save-dev express
Nach dem Express-Installation Wir erstellen eine Datei im Stammverzeichnis des Projekts namens server.js und wir fügen den folgenden Code hinzu:
 var express = erfordern ('express'); var app = express(); var port = Nummer (process.env.PORT || 3000); app.use (express.static (__ dirname + '/public')); app.listen (port, function () {console.log ('App gestartet unter http: // localhost:' + port);});
Nun führen wir den Befehl aus:
 Knotenserver.js
um den Webserver zu starten.

Wenn Sie den Webserver starten, überprüfen Sie, ob die Element-Inspector-Konsole Ihres Browsers das Wort eingegeben hat AngularJS.

Jetzt machen wir das Nutzung von ngRoute.

Routen verwenden


Wir werden die verwenden Winkelkonfigurationsfunktion um die Routen unserer Webapp zu erstellen.
 .config (function ($ routeProvider) {$ routeProvider .when ('/home', {templateUrl: 'tpl/home.html', controller: 'HomeController'}) .otherwise ({redirectTo: '/home'}); }) 
App.js-Code
  • /Heimat: die URI für unsere Homepage.
  • VorlagenURL: der Weg unserer Vorlage für zu Hause.
  • Regler: Der für die Home-Vorlage zugewiesene Controller.
  • Andernfalls: Platzieren Sie unsere Website standardmäßig in / home
Wir erstellen ein neues Verzeichnis in public namens tpl, und innerhalb von tpl erstellen wir eine Datei namens home.html.
 
Im Textkörper von index.html fügen wir ein div-Tag mit dem Attribut hinzu ng-Ansicht der für das Rendern der Vorlage home.html und der zukünftigen Vorlagen, die wir im Tutorial erstellen werden, verantwortlich ist.

Informationen zu ngView:

Code in index.html:

Wir fügen den Home-Controller hinzu controller.js
 .controller ('HomeController', Funktion () {console.log ('HomeController');})
Wenn alles richtig gelaufen ist, sollten Sie etwa das folgende Bild erhalten:

Datenpersistenz


Wir haben bereits getestet, dass unser Routendienst korrekt funktioniert, wir erstellen weiterhin ein Modul zur Verwaltung von Benutzern, in diesem Modul können wir Benutzer erstellen, auflisten, bearbeiten und löschen. Für das Tutorial müssen wir nicht mit einem Backend kommunizieren, was Wir werden Datenpersistenz mit einem Array durchführen, was bedeutet, dass diese Daten temporär sind und bei jeder Aktualisierung der Anwendung diese Daten verloren gehen.

Wir beginnen mit der Erstellung der folgenden Dateien services.js Ja Werte.js im js-Verzeichnis

 angle.module ('routeapp.values', []) .value ('Users', []); 
Values.js-Code
 angle.module ('routeapp.services', ['routeapp.values']) .factory ('Databases', ['Users', function (Users) {return {DataUser: {add: function (user) {Users.push (user);}, list: function () {return Users;}, update: function (index, user) {return Users [index] = user;}, get: function (index) {return Users [index];} , zerstören: function (index) {return Users.splice (index, 1);}}};}]) .factory ('Util', [function () {return {clone: ​​​​function (obj) {if ( null = = obj || "object"! = typeof obj) return obj; var copy = obj.constructor (); for (var attr in obj) {if (obj.hasOwnProperty (attr)) copy [attr] = obj [ attr];} Kopie zurückgeben;}}}]); 
Services.js-Code

In services js erstellen wir zwei Fabriken namens Datenbanken Ja Nützlich.

  • Datenbanken: Es kümmert sich um die Persistenz der Benutzeraufzeichnungsdaten (mit Add-, Update-, List-, Get-, Destroy-Funktionen).
  • Nützlich: Es dient als Kloner der Daten, die wir benötigen, wenn wir einen Benutzer registrieren.

Wir injizieren das Services-Modul in unsere app.js

 routeapp.services
Der Code für die erste Zeile von app.js würde so aussehen:
 angle.module ('routeapp', ['ngRoute', 'routeapp.controller', 'routeapp.services'])
Jetzt müssen wir nur noch die Skripte services.js und values.js in index.html speichern und vor dem Skript app.js platzieren, um Unannehmlichkeiten bei der Ausführung der Anwendung zu vermeiden.
 
Bevor wir fortfahren, testen wir, ob unsere Anwendung keine Fehler in der Entwicklungskonsole anzeigt. So wurden die Dateien bisher erstellt.

Wir erstellen weiterhin die Vorlagen für die Registrierung und die Liste der Benutzer. Wir erstellen innerhalb von tpl zu user.html und user-list.html

Benutzername Name E-Mail Speichern
User.html-Code
 
Nutzer Name E-Mail
{{item.username}} {{Artikelname}} {{item.email}}
Code user-list.html

Innerhalb controller.js wir fügen den Controller für user.html und user-list.html hinzu

 .controller ('UserController', function ($ scope, Databases, Util) {$ scope.user = {}; $ scope.save = function () {var user = Util.clone ($ scope.user); Databases.DataUser .add (user); $ scope.user = {};};}) .controller ('UserListController', function ($ scope, Databases) {$ scope.dataUser = Databases.DataUser.list ();})
Controller.js-Code

Fügen Sie in index.html die Links hinzu, um auf die beiden Vorlagen zuzugreifen:

  • Benutzer registrieren
  • Benutzer konsultieren
In index.html hinzugefügt

Wir müssen nur die neuen Routen, die wir erstellt haben, zur app.js-Konfiguration hinzufügen und sie vor die sonst Funktion:

 .when ('/ user', {templateUrl: 'tpl / user.html', controller: 'UserController'}) .when ('/user / list', {templateUrl: 'tpl / user-list.html', controller : 'UserListController'}) 
Mal sehen, wie alles bisher läuft.

VERGRÖSSERN

Testen Sie, indem Sie mehrere Benutzer registrieren und überprüfen, ob sie sich korrekt registrieren von Wenden Sie sich an die Benutzer.

Fertig, jetzt fahren wir mit der Aktualisierung und Eliminierung der Benutzer fort. Um einen Benutzer zu aktualisieren, fügen Sie einfach neue Funktionen hinzu BenutzerController, ändern wir den vorherigen Code für diesen neuen:

 .controller ('UserController', function ($ scope, Databases, Util, $ routeParams, $ location) {var userID = $ routeParams.userID; var isEdit = (userID! = undefined); $ scope.user = {}; if (isEdit) {$ scope.user = Databases.DataUser.get (userID);} $ scope.save = function () {var user = Util.clone ($ scope.user); if (isEdit) {Databases.DataUser. update (userID, user); $ location.path ('/ user / list');} else {Databases.DataUser.add (user);} $ scope.user = {};};}) 
Erklärung des neuen Codes:
  • $ routeParams: Dieser Dienst gibt die GET-Parameter unserer Anwendung zurück. In diesem Fall verwenden wir ihn, um die ID des Benutzers zurückzugeben, den wir aktualisieren werden. $ routeParams.userID. Weitere Informationen zu $ ​​routerParams https: //docs.angular … ce / $ routeParams

Wir müssen auch einen neuen Pfad in der Konfiguration von app.js hinzufügen:

 .when ('/ user /: userID', {templateUrl: 'tpl / user.html', controller: 'UserController'})
Es ist wichtig, diesen neuen Pfad unter dem Pfad '/user/list' zu platzieren, damit er uns einen Konflikt mit dem letzteren präsentiert.
  • '/Benutzer /: Benutzer-ID': Wie wir sehen, hat diese URL etwas Besonderes namens: userID, dies ist der Parameter, den wir in UserController verwenden.

Es bleibt nur noch eine neue Spalte in user-list.html hinzuzufügen, in der wir einen Link hinzufügen, um den registrierten Benutzer zu bearbeiten.

 Bearbeiten
Code in user-list.html

Jetzt müssen wir nur noch diese neue Operation testen, die Anwendung aktualisieren, registrieren und dann den Benutzer bearbeiten.

Wir müssen nur die Funktionalität zum Löschen von Benutzern hinzufügen. Wir erstellen eine neue Vorlage in tpl namens user-delete.html

Sie möchten entfernen {{Nutzername}}?Entfernen 
Benutzer-delete.html-Code

Wir fügen einen neuen Link in die Tabelle user-list.html ein, um auf die Vorlage user-delete.html zuzugreifen

 Entfernen
Wir fügen in controller.js den Controller für user-delete.html namens UserDeleteController . hinzu
 .controller ('UserDeleteController', function ($ scope, Databases, $ routeParams, $ location) {var userID = $ routeParams.userID; $ scope.user = Databases.DataUser.get (userID); $ scope.destroy = function ( ) {Databases.DataUser.destroy (userID); $ location.path ('/user / list');}}) 
Und wir fügen den Pfad in der Konfiguration von app.js hinzu
 .when ('/ user / delete /: userID', {templateUrl: 'tpl / user-delete.html', controller: 'UserDeleteController'})
Wir aktualisieren die Anwendung, registrieren und testen dann den Vorgang zum Entfernen des Benutzers.

Wir haben unsere Basisanwendung abgeschlossen! Wir beherrschen das Erstellen von manuellen Routen in unserer Anwendung bereits, aber wenn wir genau hinschauen und sehen, was die Routen gebaut sind:

  • /Heimat
  • / Nutzer
  • / Benutzerliste
  • / user /: userID
  • / user / delete /: userID
Wir haben 4 Routen für das Benutzerpersistenzmodul und das Home-Modul erstellt. Wenn wir andere Persistenzmodule für unsere Anwendung erstellen müssten, z. B. Produkte, Kunden, Vertrieb usw. Wir müssten 12 weitere Routen erstellen. Dadurch würde unsere app.js-Datei jedes Mal wachsen, wenn wir neue Routen hinzufügen. Um dies zu vermeiden, werden wir einen dynamischen Routengenerator erstellen, um diese Kopfschmerzen zu vermeiden.

So erstellen Sie dynamische Routen


Schauen wir uns unsere aktuellen Routen genau an, um einen neuen Benutzer zu erstellen, verwenden wir die Route / den Benutzer.
  • Um die Benutzer / Benutzer / Liste abzufragen
  • Um es zu bearbeiten / user /: userID
  • Löschen / Benutzer / Löschen /: Benutzer-ID.

Wir können einige Routen erstellen, bei denen nur ein, zwei oder drei Parameter verwendet werden, und diese erfassen sie, verwenden sie nach unseren Wünschen. Es würde so aussehen:

Wir müssen etwas klarstellen, damit dynamische Routen richtig funktionieren, müssen wir die folgenden Regeln befolgen, um sie zu erklären, verwenden wir dasselbe Beispiel von Benutzer:

1. Der Name user sollte sowohl als Vorlage als auch als Controller-Präfix verwendet werden.

2. Für die Abfragen als zweites Präfix im Tutorial verwenden wir die Wortliste, genauso wie Sie sie beliebig ändern können, aber das Wort, das Sie verwenden, muss es sowohl im Namen der Vorlage als auch im Namen enthalten des Controllers. Beispiel: user-list.html und UserListController; zum Löschen: user-delete.html und UserDeleteController

3. Um die Präfixe in den Controllern zu identifizieren, verwenden Sie Großbuchstaben.

4. Controller-Namen müssen immer mit dem Wort Controller enden.

 var route = {controller: 'RouteController', templateUrl: function (uri) {var pattern = new RegExp ("[0-9] +"); var part_uri = (! pattern.test (uri.param2) && typeof uri.param2! == 'undefiniert')? '-' + uri.param2: ''; 'tpl /' + uri.param1 + part_uri + '.html' zurückgeben; }}; $ routeProvider .when ('/: param1', route) .when ('/: param1 /: param2', route) .when ('/: param1 /: param2 /: param3', route) .otherwise ({redirectTo: '/Heimat'}); 
Code in app.js

Wir erstellen drei Pfadmuster, wenn Sie also nur einen einzigen Parameter haben, würde dieser für / user und / home funktionieren. Für zwei Parameter / user /: userID und /user / list. Für drei Parameter / user / delete /: userID

Wir müssen auch einen neuen Controller erstellen, der die verschiedenen Controller je nach URI leitet.

 .controller ('RouteController', Funktion ($ scope, $ routeParams, $ controller, $ filter) {var prefix = $ filter ('prefixController') ($ routeParams.param1) + '' + $ filter ('prefixController') ( $ routeParams.param2); $ Controller (Präfix + 'Controller', {$ scope: $ scope});}) 
RouteController-Code

Dieser Controller wiederum hängt von einem Filter ab, wir erstellen eine neue Datei im js-Verzeichnis namens filter.js

 angle.module ('routeapp.filters', []) .filter ('prefixController', function () {return function (text) {if (typeof text === 'undefined') {return '';} var p_string = new RegExp ('[az] + [0-9] *'); var p_int = new RegExp ("[0-9] +"); if (p_int.test (text)) {return '';} else if (p_string.test (text)) {return text.charAt (0) .toUpperCase () + ((text.length> 1)? text.slice (1): '');} else {return '';}};}); 
Filters.js-Code

Wir injizieren den Filter in app.js

 routeapp.filter
Wir importieren das Skript filter.js in index.html, das vor app.js platziert wird
 
Wir müssen ein letztes Detail ändern in BenutzerController Ja BenutzerDeleteController. Wie jetzt verwenden wir Parameter: param1,: param2,: param3; der Parameter: userID ist nicht mehr verfügbar. Was wir in den Controllern ändern müssen. Verwenden Sie für UserController param2 und für UserDeleteController param3

Code BenutzerController:

 var userID = $ routeParams.param2;
Code BenutzerDeleteController:
 var userID = $ routeParams.param3;
Wir haben unseren dynamischen Router fertiggestellt. Jetzt müssen wir uns nicht mehr darum kümmern, neue Routen zu unserer Website zu erstellen, da alles von unserem gesteuert wird RouterController und der neuen Konfiguration des $routerProviders können Sie diesen testen, indem Sie neue Templates erstellen und seine Routen und Controller zuweisen. Schließlich können wir eine neue Vorlage erstellen, die uns helfen kann, beim Versuch, auf eine URL zuzugreifen, die auf unserer Website nicht gefunden wird, zu erkennen. Wir können eine 404-Vorlage verwenden, die wir in tpl mit dem Namen 404.html erstellen

Code für 404.html

 
404Controller-Controller
 .controller ('404Controller', Funktion () {})
Damit wir erkennen können, wenn wir versuchen, auf eine nicht verfügbare Route zuzugreifen, können wir a anglejs Hörer wer kümmert sich darum. Wir ersetzen den Code von Hauptcontroller durch folgendes:
 .controller ('MainController', function ($ scope, $ location) {console.log ('AngularJS'); $ scope. $ on ('$ routeChangeError', function (next, current) {$ location.path ('/ 404 ');});}) 
Führen Sie einfach die Anwendung aus und geben Sie eine URL ein, die auf unserer Website nicht verfügbar ist, zum Beispiel http: // localhost: 300… unknown-url. Die Anwendung wird sofort auf / 404 umgeleitet

Du kannst Laden Sie diese Tutorial-Demo herunter hier:

routeapp.zip 344.9K 259 Downloads

wave wave wave wave wave