Erstellen Sie dynamische Routen mit ngRoute aus AngularJS

angle-js-solvetic.jpg

Hinweis
Für die Realisierung dieses Tutorials ist es ratsam, klare Grundlagen für AngularJS zu haben , da wir auf einige technische Aspekte dieser Technologie nicht näher eingehen werden.

Obwohl wir wissen, dass AngularJS uns eine große Anzahl von Modulen, Diensten und Filtern zur Verfügung stellt, die für die Erstellung einer Web- oder Mobilanwendung von heute nützlich sind. Es gibt andere Module, die wir im Kern dieses Frameworks nicht finden, eines davon ist ngRoute. Dieses Modul hat die Funktion, benutzerfreundliche URLs zu verwenden, die einen Treiber und eine Vorlage zuweisen, die automatisch über Ajax aufgerufen wird.

Weitere Informationen zu ngRoute:

Offizielle ngRoute

Verwendung von ngRoute

Zuerst erstellen wir unser Projektverzeichnis, wir werden es routeapp nennen, in diesem Verzeichnis erstellen wir einen weiteren öffentlichen Aufruf, in der Öffentlichkeit erstellen wir eine index.html-Datei. Jetzt erstellen wir in public ein Verzeichnis mit dem Namen js, in dem wir unsere Winkeldatei ablegen. Innerhalb von js haben wir begonnen, zwei erste Dateien namens app.js und controller.js zu platzieren

Wir können alle aktuellen Versionen von anglejs unter folgendem Link herunterladen: https://code.angularjs.org/ . Zur Verwendung des Tutorials verwenden wir Version 1.5.5 https://code.angularjs.org/1.5.5/
Code index.html

 <! DOCTYPE html> <html lang = "de" ng-app = "routeapp" ng-controller = "MainController"> <head> <meta charset = "UTF-8"> <title> Ng Route Dynamic </ title> </ head> <body> <script src = "https://code.angularjs.org/1.5.5/angular.min.js"> </ script> <script src = "https://code.angularjs.org/1.5.5/angular-route.min.js"> </ script> <script src = "js / controller.js"> </ script> <script src = "js / app.js"> </ script> </ body> </ html> 

Code app.js

 angle.module ('routeapp', ['ngRoute', 'routeapp.controller']) ; 

Code controller.js

 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 , T omcat , etc. Für meinen Fall werde ich Express von nodejs verwenden. Wenn Sie dies auch mit nodejs tun möchten, können Sie die nächsten 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 über die Befehlszeile.

 npm ini 
 npm install --save-dev express 

Nach der Installation von Express haben wir im Stammverzeichnis des Projekts eine Datei namens server.js erstellt und den folgenden Code hinzugefügt:

 var express = require ('express'); var app = express (); var port = Number (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:

 Knoten server.js 

um den Webserver zu starten.

Stellen Sie beim Starten des Webservers sicher, dass die Konsole des Elementinspektors Ihres Browsers das Wort AngularJS geschrieben hat .

routen-dinamicas-Ngroute-AngularJS-1.jpg

routen-dinamicas-Ngroute-AngularJS-2.jpg

routen-dinamicas-Ngroute-AngularJS-3.jpg

Nutzen wir nun ngRoute .

Routen benutzen

Wir werden die Konfigurationsfunktion von angle verwenden, um die Routen unserer Webapp zu erstellen.

 .config (function ($ routeProvider) { $ routeProvider .when ('/ home', {templateUrl: 'tpl / home.html', controller: 'HomeController'}) .otherwise ({redirectTo: '/ home'}); }) 

Code app.js

  • / home: Die URI für unsere Homepage.
  • templateURL: die Route unserer Vorlage für Zuhause.
  • controller: Der der Ausgangsvorlage zugewiesene Controller.
  • Ansonsten: Setzen Sie unsere Website standardmäßig in / home

Wir haben in public ein neues Verzeichnis mit dem Namen tpl erstellt und in tpl eine Datei mit dem Namen home.html.

 <h1> Willkommen bei meiner Bewerbung </ h1> 

Im Hauptteil von index.html fügen wir ein div-Tag mit dem Attribut ng-view hinzu , das für das Rendern der Vorlage home.html und der zukünftigen Vorlagen verantwortlich ist, die wir im Lernprogramm erstellen werden.

Informationen zu ngView:

ngView

Code in index.html:

 <div ng-view> </ div> 

Wir fügen den Home- Controller zu controller.js hinzu

 .controller ('HomeController', function () { console.log ('HomeController'); }) 

Wenn alles richtig gelaufen ist, sollten Sie so etwas wie das folgende Bild bekommen:

See also  Beheben und Reparieren des Windows 10-Taktfehlers

routen-dinamicas-Ngroute-AngularJS-4.jpg

Datenpersistenz

Wir haben bereits bewiesen, dass unser Routendienst ordnungsgemäß funktioniert. Wir fahren mit der Erstellung eines Moduls zur Verwaltung der Benutzer fort. In diesem Modul können wir Benutzer erstellen, auflisten, bearbeiten und löschen. Für das Lernprogramm müssen wir nicht mit einem Backend kommunizieren, wodurch die Daten in einem Array erhalten bleiben. Dies bedeutet, dass diese Daten temporär sind und bei jeder Aktualisierung der Anwendung diese Daten verloren gehen.

Zunächst erstellen wir die folgenden Dateien services.js und values.js im Verzeichnis js

 angle.module ('routeapp.values', []) .value ('Benutzer', []) ; 

Code von values.js

 angle.module ('routeapp.services', ['routeapp.values']) .factory ('Datenbanken', ['Benutzer', Funktion (Benutzer) { Rückkehr { DataUser: { add: function (user) { Users.push (Benutzer); }, list: function () { Benutzer zurückgeben; }, Update: Funktion (Index, Benutzer) { return Users [index] = Benutzer; }, get: function (index) { return Users [index]; }, destroy: function (index) { return Users.splice (index, 1); } } }; }]) .factory ('Util', [function () { Rückkehr { Klon: Funktion (obj) { if (null == obj || "object"! = typeof obj) return obj; var copy = obj.constructor (); für (var attr in obj) { if (obj.hasOwnProperty (attr)) copy [attr] = obj [attr]; } Kopie zurücksenden; } } }]) ; 

Services.js Code

In services js erstellen wir zwei Factorys namens Databases und Util.

  • Datenbanken: Es kümmert sich um die Persistenz der Daten der Benutzerregister (mit den Funktionen Hinzufügen, Aktualisieren, Auflisten, Abrufen, Zerstören) .
  • Nützlich: Es dient uns als Kloner der Daten, die wir benötigen, wenn wir einen Benutzer registrieren.

Wir fügen das Servicemodul in unsere app.js ein

 routeapp.services 

Der Code der ersten Zeile von app.js würde folgendermaßen 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.

 <script src = "js / controller.js"> </ script> <script src = "js / values.js"> </ script> 

Bevor Sie fortfahren, beweisen wir, dass unsere Anwendung keine Fehler in der Entwicklungskonsole enthält. So sind die bisher erstellten Dateien.

routen-dinamicas-Ngroute-AngularJS-5.jpg

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

 <form> <div> <label for = "username"> Benutzername <input type = "text" ng-model = "user.username"> </ label> <label for = "name"> Name <input type = "text" ng-model = "user.name"> </ label> <label for = "email"> E-Mail <input type = "text" ng-model = "user.email"> </ label> <button ng-click = "save ()"> Speichern </ button> </ div> </ form> 

Code user.html

 <table> <tr> <th> User </ th> <th> Name </ th> <th> Mail </ th> </ tr> <tr ng-repeat = "item in dataUser"> <td> {{item.username}} </ td> <td> {{item.name}} </ td> <td> {{item.email}} </ td> </ tr> </ table> 

Code user-list.html

In controller.js fügen wir den Treiber für user.html und user-list.html hinzu

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

Code controller.js

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

 <ul> <li> <a href="#/user"> Nutzer registrieren </a> </ li> <li> <a href="#/user/list"> Nutzer konsultieren </a> </ li> </ ul> 

Hinzugefügt in index.html

Wir müssen nur die neuen Routen, die wir erstellt haben, zu app.js config hinzufügen und sie vor die Funktion else stellen:

 .when ('/ user', {templateUrl: 'tpl / user.html', controller: 'UserController'}) .when ('/ user / list', {templateUrl: 'tpl / user-list.html', controller: 'UserListController'}) 

Mal sehen, wie alles bis jetzt geht.

routen-dinamicas-Ngroute-AngularJS-6.jpg

routen-dinamicas-Ngroute-AngularJS-7.jpg

routen-dinamicas-Ngroute-AngularJS-8.jpg

Testen Sie die Registrierung mehrerer Benutzer und stellen Sie sicher, dass diese ordnungsgemäß von Consult Users registriert werden .

routen-dinamicas-Ngroute-AngularJS-9.jpg

routen-dinamicas-Ngroute-AngularJS-10.jpg

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

 .controller ('UserController', Funktion ($ 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 (Benutzer-ID, Benutzer); $ location.path ('/ user / list'); } else { Databases.DataUser.add (Benutzer); } $ scope.user = {}; }; }) 

Erklärung des neuen Codes:

  • $ routeParams: Dieser Dienst gibt die GET-Parameter unserer Anwendung zurück. In diesem Fall geben wir die Benutzer-ID zurück, die aktualisiert werden soll. $ routeParams.userID. Weitere Informationen zu $ ​​routerParams finden Sie unter https://docs.angular…ce/$routeParams
See also  Erstellen Sie einen Konfigurationsdruckserver in Windows Server 2016

Wir müssen auch eine neue Route in app.js config hinzufügen:

 .when ('/ user /: userID', {templateUrl: 'tpl / user.html', controller: 'UserController'}) 

Es ist wichtig, diese neue Route unter dem Pfad ‘/ user / list’ zu platzieren, damit wir einen Konflikt mit der letztgenannten darstellen.

  • ‘/ user /: userID’: Wie wir sehen können, hat diese URL eine spezielle Bezeichnung: userID, dies ist der Parameter, den wir in UserController verwenden werden.

Wir müssen nur eine neue Spalte in user-list.html hinzufügen, in der wir einen Link hinzufügen, um den registrierten Benutzer zu bearbeiten.

 <td> <a href="#/user/{{$in}}"> Bearbeiten </a> </ td> 

Code in user-list.html

Jetzt müssen wir nur noch diesen neuen Vorgang ausprobieren, die Anwendung aktualisieren, registrieren und dann den Benutzer bearbeiten.

routes-dinamicas-Ngroute-AngularJS-11.jpg

routen-dinamicas-Ngroute-AngularJS-12.jpg

routen-dinamicas-Ngroute-AngularJS-13.jpg

routen-dinamicas-Ngroute-AngularJS-14.jpg

routen-dinamicas-Ngroute-AngularJS-15.jpg

Wir müssen nur die Funktionalität hinzufügen, um Benutzer zu eliminieren. Wir erstellen in tpl eine neue Vorlage namens user-delete.html

 <h1> Nutzer entfernen </ h1> <div> Sie möchten <strong> {{user.name}} </ strong> löschen? </ div> <button ng-click = "destroy ();"> Löschen </ button> 

Code von user-delete.html

Wir fügen der Tabelle user-list.html einen neuen Link hinzu, um auf die Vorlage user-delete.html zugreifen zu können

 <td> <a href="#/user/delete/{{$in}}"> Löschen </a> </ td> 

Wir fügen den Controller für user-delete.html mit dem Namen UserDeleteController in controller.js hinzu

 .controller ('UserDeleteController', Funktion ($ 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 config von app.js hinzu

 .when ('/ user / delete /: userID', {templateUrl: 'tpl / user-delete.html', controller: 'UserDeleteController'}) 

Aktualisieren Sie die Anwendung, registrieren Sie sich und testen Sie den Vorgang zum Entfernen des Benutzers.

routen-dinamicas-Ngroute-AngularJS-16.jpg

routen-dinamicas-Ngroute-AngularJS-17.jpg

routen-dinamicas-Ngroute-AngularJS-18.jpg

Wir haben unsere Basisanwendung beendet! Wir haben bereits die Erstellung manueller Routen in unserer Anwendung gemeistert, aber wenn wir genau hinschauen und sehen, welche Routen erstellt werden:

  • / home
  • / user
  • / user / list
  • / user /: userID
  • / user / delete /: userID

Wir haben 4 Routen für das User Persistence-Modul und die Home-Route 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. Wodurch unsere app.js-Datei jedes Mal wächst, wenn wir neue Routen hinzufügen. Um dies zu vermeiden, erstellen wir einen Generator für dynamische Routen, um diese Kopfschmerzen zu vermeiden.

So erstellen Sie dynamische Routen

Lassen Sie uns unsere aktuellen Routen analysieren, um einen neuen Benutzer zu erstellen, verwenden wir den Pfad / Benutzer.

  • Um Benutzer / Benutzer / Liste zu konsultieren
  • So bearbeiten Sie es / user /: userID
  • So entfernen Sie / user / delete /: userID.

Wir können Routen erstellen, bei denen nur ein, zwei oder drei Parameter verwendet werden, und diese werden nach Belieben erfasst. Es würde so aussehen:

Wir müssen etwas klarstellen, damit dynamische Routen korrekt funktionieren. Wir müssen die folgenden Regeln befolgen, um sie zu erläutern. Wir werden dasselbe Benutzerbeispiel verwenden:

1. Der Benutzername muss sowohl als Präfix der Vorlage als auch der Steuerung verwendet werden.

2. Für die Abfragen als zweites Präfix im Lernprogramm verwenden wir die Wortliste. Auf die gleiche Weise können Sie sie für die gewünschte Liste ändern. Das verwendete Wort muss jedoch sowohl im Namen der Vorlage als auch im Namen des Controllers enthalten sein. ZB: user-list.html und UserListController; Zum Löschen: user-delete.html und UserDeleteController

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

See also  Funktionen und wie man Fedora 29 installiert

4. Die Namen der Controller 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! == 'undefined')? '-' + uri.param2: ''; return 'tpl /' + uri.param1 + part_uri + '.html'; } }; $ routeProvider .when ('/: param1', route) .when ('/: param1 /: param2', route) .when ('/: param1 /: param2 /: param3', route) .otherwise ({redirectTo: '/ home'}); 

Code in app.js

Wir erstellen drei Routenmuster für den Fall, dass Sie nur einen einzigen Parameter haben, der für / user und / home funktionieren würde. 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 für die Steuerung der verschiedenen Controller in Abhängigkeit von der URI verantwortlich ist.

 .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 Treiber ist wiederum von einem Filter abhängig. Wir erstellen eine neue Datei mit dem Namen filters.js im Verzeichnis js

 angle.module ('routeapp.filters', []) .filter ('prefixController', function () { Rückgabefunktion (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 ''; } }; }) ; 

Code von filters.js

Wir injizieren den Filter in app.js

 routeapp.filters 

Wir importieren das Skript filters.js nach index.html, das vor app.js steht

 <script src = "js / filters.js"> </ script> 

Wir müssen ein letztes Detail in UserController und UserDeleteController ändern . Da wir jetzt Parameter verwenden: 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

UserController- Code:

 var userID = $ routeParams.param2; 

UserDeleteController- Code:

 var userID = $ routeParams.param3; 

Wir haben unseren dynamischen Router fertiggestellt. Jetzt müssen wir uns nicht mehr um das Erstellen neuer Routen zu unserer Site kümmern, da alles von unserem RouterController und der neuen Konfiguration des $ routerProviders gesteuert wird. Sie können es versuchen, indem Sie neue Vorlagen erstellen und ihre Routen und Controller zuweisen. Zum Abschluss können wir eine neue Vorlage erstellen, die zum Erkennen verwendet werden kann, wenn versucht wird, auf eine URL zuzugreifen, die sich nicht auf unserer Website befindet. Wir können eine Vorlage 404 verwenden. Wir werden sie in tpl mit dem Namen 404.html erstellen

Code für 404.html

 <h1> Hoppla, dieser Abschnitt ist in unserer Anwendung nicht verfügbar. </ h1> 

404Controller-Treiber

 .controller ('404Controller', function () { }) 

Damit wir feststellen können, wenn wir versuchen, auf eine nicht verfügbare Route zuzugreifen, können wir einen AngularJS-Listener verwenden , der sich darum kümmert. Wir ersetzen den MainController- Code durch folgenden:

 .controller ('MainController', Funktion ($ scope, $ location) { console.log ('AngularJS'); $ scope. $ on ('$ routeChangeError', Funktion (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, z. B. http: // localhost: 300 … url-unknown . Die Anwendung wird sofort zu / 404 umgeleitet

routen-dinamicas-Ngroute-AngularJS-19.jpg

Sie können diese Tutorial-Demo hier herunterladen :

Angehängte Datei 167 Descargas routeapp.zip 344.9K 167 Downloads

administrator

Leave a Reply

Your email address will not be published. Required fields are marked *