AngularJS-Routing mit Parametern

โšก Intelligente Zusammenfassung

Routing in AngularJS wandelt eine einzelne HTML-Seite mithilfe einer Karte in eine Multi-View-Anwendung um.ping URL Fragmente werden Vorlagen und Controllern zugeordnet. Das ngRoute-Modul und der $routeProvider-Dienst definieren diese Zuordnung.pings, wรคhrend die ng-view-Direktive die passende Vorlage einfรผgt.

  • ๐Ÿงฉ Kernmechanismus: $routeProvider findet das Fragment nach dem #-Symbol und lรคdt die zugehรถrige templateUrl und den Controller in ng-view.
  • ๐Ÿ“ฆ Erforderliche Abhรคngigkeit: Das Routing ist nicht Teil der Kernbibliothek, daher muss angular-route.js referenziert und ngRoute im Modul deklariert werden.
  • ๐ŸŽฏ Standardroute: Der โ€žotherwise blockโ€œ leitet alle nicht รผbereinstimmenden Pfade um und verhindert so, dass beim ersten Laden der Anwendung eine leere Ansicht angezeigt wird.
  • ๐Ÿ”ข Routenparameter: Ein Doppelpunkt-Platzhalter wie z. B. :topicId erfasst URL Segmente, die der Controller รผber $routeParams liest.
  • โณ Datenvorladen: Die resolve-Eigenschaft schlieรŸt das Abrufen der Daten ab, bevor der Controller ausgefรผhrt wird, sodass die Ansicht niemals in einem leeren Zustand gerendert wird.
  • ๐Ÿ”— Clean URLs: Durch die Einstellung html5Mode auf $locationProvider wird der Hash entfernt, allerdings muss der Server dann unbekannte Pfade auf die Basisseite umschreiben.

AngularJS-Routing mit Parametern

Bevor wir uns mit der Funktionsweise des Routings in AngularJS befassen, ist es hilfreich zu verstehen, fรผr welche Art von Anwendung das Routing entwickelt wurde. Der folgende Abschnitt erlรคutert diesen Kontext, und alle nachfolgenden Techniken bauen darauf auf.

Was sind Single-Page-Anwendungen?

Single-Page-Anwendungen (SPAs) sind Webanwendungen, die eine einzelne HTML-Seite laden und diese dann dynamisch aktualisieren, sobald der Benutzer mit ihr interagiert. Anstatt bei jedem Klick ein neues Dokument vom Server anzufordern, tauscht eine SPA nur den geรคnderten Teil der Seite aus.

Dieses Design birgt ein Problem: Wenn der Browser nie zu einem neuen Dokument navigiert, รคndert sich die Adressleiste nicht, sodass der Benutzer weder eine Seite als Lesezeichen speichern, noch teilen oder die Zurรผck-Taste verwenden kann. Routing lรถst genau dieses Problem.

Was ist Routing in AngularJS?

Routing in AngularJS ist eine Methode, mit der Sie Single-Page-Anwendungen erstellen kรถnnen. Sie ermรถglicht es Ihnen, verschiedene URLAngularJS-Routing ermรถglicht die Anzeige unterschiedlicher Inhalte in Ihren Webanwendungen. Es hilft dabei, je nach gewรคhlter Route verschiedene Inhalte anzuzeigen. Dies wird in der Datei `/json/s` spezifiziert. URL nach dem #-Zeichen.

Nehmen wir als Beispiel eine Website, die รผber den URL http://example.com/index.html.

Diese Seite enthรคlt die Hauptseite Ihrer Anwendung. Angenommen, die Anwendung organisiert eine Veranstaltung und der Benutzer mรถchte die Veranstaltungen auflisten, eine einzelne detailliert anzeigen oder eine lรถschen. In einer Single-Page-Anwendung mit aktiviertem Routing ist all dies รผber die folgenden Links mรถglich.

Das #-Symbol wรผrde zusammen mit den verschiedenen Routen (ShowEvent, DisplayEvent und DeleteEvent) verwendet werden.

  • Um alle Ereignisse zu sehen, wird der Benutzer weitergeleitet zu http://example.com/index.html#ShowEvent
  • Um eine bestimmte Veranstaltung zu sehen, werden sie weitergeleitet zu http://example.com/index.html#DisplayEvent
  • Um ein Ereignis zu lรถschen, werden sie weitergeleitet zu http://example.com/index.html#DeleteEvent

Beachten Sie, dass das Haupt URL Es bleibt alles gleich. Nur der Teil nach dem # รคndert sich, und genau diesen Teil รผberwacht AngularJS. Nachdem das Konzept geklรคrt ist, behandelt der nรคchste Abschnitt die Komponenten, die Sie miteinander verbinden mรผssen, damit alles funktioniert.

Hinzufรผgen einer AngularJS-Route mit $routeProvider

Wie bereits erwรคhnt, Routen in AngularJS Sie dienen dazu, den Benutzer zu einer anderen Ansicht Ihrer Anwendung weiterzuleiten. Diese Weiterleitung erfolgt auf derselben HTML-Seite, sodass der Benutzer den Eindruck hat, die Seite nicht verlassen zu haben.

Um das Routing zu implementieren, mรผssen die folgenden Hauptschritte in beliebiger Reihenfolge in Ihrer Anwendung implementiert werden.

  1. Verweisen Sie auf angular-route.js. JavaSkript Datei, entwickelt von Google, enthรคlt die gesamte Routing-Funktionalitรคt und muss eingebunden werden, damit die Anwendung auf die Routing-Anforderungen der Module zugreifen kann.
  2. Fรผgen Sie in Ihrer Anwendung eine Abhรคngigkeit zum ngRoute-Modul hinzu. Ohne diese Abhรคngigkeit kann das Routing in der AngularJS-Anwendung รผberhaupt nicht verwendet werden.

Nachfolgend finden Sie die allgemeine Syntax dieser Anweisung. Dies ist lediglich eine normale Deklaration eines Moduls unter Einbeziehung des Schlรผsselworts ngRoute.

var module = angular.module("sampleApp", ['ngRoute']);
  1. Konfigurieren Sie Ihren $routeProvider. Dieser stellt die verschiedenen Routen in Ihrer Anwendung bereit, und die Syntax legt einfach fest, dass beim Auswรคhlen des entsprechenden Pfades die Route verwendet wird, um die angegebene Ansicht anzuzeigen.
when(path, route)
  1. Links zu Ihrer Route von Ihrer HTML-Seite aus. Auf Ihrer HTML-Seite fรผgen Sie Referenzlinks zu den verschiedenen verfรผgbaren Routen in Ihrer Anwendung hinzu.
<a href="#!/route1">Route 1</a><br/>
  1. SchlieรŸlich wรคre die Aufnahme der ng-view-Direktive, was normalerweise in einem div-Tag wรคre. Dies wรผrde verwendet werden, um den Inhalt der Ansicht einzufรผgen, wenn die relevante Route ausgewรคhlt wird.

๐Ÿ’ก TIPP: Alle fรผnf Schritte sind zwingend erforderlich. Ein fehlender Verweis auf angular-route.js ist die hรคufigste Ursache dafรผr, dass eine Route keine Funktion hat, da $routeProvider ohne diesen Verweis nicht existiert. Im nรคchsten Abschnitt werden alle fรผnf Schritte in einem funktionierenden Beispiel zusammengefรผhrt.

AngularJS-Routing-Beispiel

Schauen wir uns nun ein Beispiel fรผr das Routing mit den oben genannten Schritten an.

In unserem AngularJS-Routing-Beispiel mit Parametern:

  • Ein Link dient dazu, die Themen fรผr ein AngularJS Natรผrlich, und der andere ist fรผr die Node.js an.
  • Wenn der Benutzer auf einen der Links klickt, werden die Themen fรผr diesen Kurs angezeigt.

Schritt 1) Fรผgen Sie die Angular-Route-Datei als Skriptreferenz ein.

AngularJS-Routing

Diese Routendatei ist erforderlich, um die Funktionalitรคt mehrerer Routen und Ansichten nutzen zu kรถnnen. Sie kann von der AngularJS-Website heruntergeladen werden.

Schritt 2) Fรผgen Sie href-Tags hinzu, die Links zu โ€žAngular JS Topicsโ€œ und โ€žNode JS Topicsโ€œ darstellen.

AngularJS-Routing

Schritt 3) Fรผgen Sie ein div-Tag mit der ng-view-Direktive hinzu, das die Ansicht darstellt.

Dadurch kann die entsprechende Ansicht immer dann eingefรผgt werden, wenn der Benutzer entweder auf โ€žAngular JS Topicsโ€œ oder โ€žNode JS Topicsโ€œ klickt.

AngularJS-Routing

Schritt 4) Fรผgen Sie in Ihrem Skript-Tag fรผr AngularJS das โ€žngRoute-Modulโ€œ und den โ€ž$routeProviderโ€œ-Dienst hinzu.

AngularJS-Routing

Code Erlรคuterung:

  1. Binden Sie das โ€žngRoute-Modulโ€œ ein. Damit รผbernimmt Angular das Routing automatisch und versteht alle Routing-Befehle.
  2. Der $routeProvider ist ein Dienst, der im Hintergrund auf aufgerufene Routen lauscht. Wenn der Benutzer auf einen Link klickt, erkennt er dies und entscheidet, welche Route aufgerufen werden soll.
  3. Erstellen Sie eine Route fรผr den Angular-Link: Wenn darauf geklickt wird, injizieren Sie Angular.html und verwenden Sie 'AngularController' fรผr die Geschรคftslogik.
  4. Erstellen Sie eine Route fรผr den Node-Link, die Node.html einbindet und 'NodeController' auf die gleiche Weise verwendet.

Schritt 5) Als Nรคchstes mรผssen Controller hinzugefรผgt werden, um die Geschรคftslogik sowohl fรผr den AngularController als auch fรผr den NodeController zu verarbeiten.

In jedem Controller erstellen wir ein Array von Schlรผssel-Wert-Paaren, um die Themennamen und -beschreibungen fรผr jeden Kurs zu speichern. Die Array-Variable โ€žtutorialโ€œ wird dem Scope-Objekt jedes Controllers hinzugefรผgt.

AngularJS-Routing

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Event Registration</title>
</head>
<body ng-app="sampleApp">

<script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>
<script src="https://code.angularjs.org/1.8.3/angular-route.js"></script>

<h1> Guru99 Global Event</h1>

<div class="container">
<ul>
<li><a href="#!/Angular">Angular JS Topics</a></li>
<li><a href="#!/Node">Node JS Topics</a></li>
</ul>
<div ng-view></div>
</div>

<script>
var sampleApp = angular.module('sampleApp', ['ngRoute']);

sampleApp.config(['$routeProvider',
function($routeProvider) {
  $routeProvider.
  when('/Angular', {
    templateUrl: 'Angular.html',
    controller: 'AngularController'
  }).
  when('/Node', {
    templateUrl: 'Node.html',
    controller: 'NodeController'
  });
}]);

sampleApp.controller('AngularController', function($scope) {
  $scope.tutorial = [
    {Name: "Controllers", Description: "Controllers in action"},
    {Name: "Models", Description: "Models and binding data"},
    {Name: "Directives", Description: "Flexibility of Directives"}
  ];
});

// NodeController follows the same shape with Node.js topics
sampleApp.controller('NodeController', function($scope) {
  $scope.tutorial = [{Name: "Promises", Description: "Power of Promises"}];
});
</script>
</body>
</html>

โš ๏ธ Korrekturen wurden vorgenommen. Das <title> Das Etikett saรŸ innen <body>, chrset="UTF 8" war falsch geschrieben, der zweite Link verwies auf #Node.html anstelle der registrierten Route /Nodeund die Vorlagenpfade enthielten einen fรผhrenden Schrรคgstrich, der vom Domain-Root aus aufgelรถst wurde.

AngularJS-Routing

Schritt 6) Erstellen Sie Seiten mit den Namen Angular.html und Node.html. Fรผr jede Seite fรผhren wir die folgenden Schritte aus.

Diese Schritte stellen sicher, dass alle Schlรผssel-Wert-Paare des Arrays auf jeder Seite angezeigt werden.

  1. Verwendung der ng-repeat-Direktive um jedes in der Tutorial-Variable definierte Schlรผssel-Wert-Paar durchzugehen.
  2. Zeigt den Namen und die Beschreibung jedes Schlรผssel-Wert-Paares an.
  • Angular.html
<h2>Angular</h2>
<ul ng-repeat="ptutor in tutorial">
<li>Course : {{ptutor.Name}} - {{ptutor.Description}}</li>
</ul>
  • Node.html โ€” identisch mit dem obigen Eintrag, nur dass die รœberschrift in โ€žKnotenโ€œ geรคndert wurde. Beide Vorlagen enthalten denselben Text. tutorial Variable, die jeder Controller aus seinem eigenen Gรผltigkeitsbereich bereitstellt.

AngularJS-Routing

โš ๏ธ Korrektur: Die รœberschrift in der ursprรผnglichen Angular.html-Datei lautete โ€žAngulerโ€œ. Die Schreibweise wurde oben korrigiert.

Wenn der Code erfolgreich ausgefรผhrt wird, wird beim Ausfรผhren des Codes im Browser die folgende Ausgabe angezeigt.

Ausgang:

AngularJS-Routing

Wenn Sie auf den Link โ€žAngularJS Topicsโ€œ klicken, wird die unten stehende Ausgabe angezeigt.

AngularJS-Routing

Die Ausgabe zeigt deutlich, dass

  • Wenn auf den Link โ€žAngular JS Topicsโ€œ geklickt wird, entscheidet der routeProvider, den wir in unserem Code deklariert haben, dass der Angular.html-Code eingefรผgt werden soll.
  • Dieser Code wird in das โ€ždivโ€œ-Tag eingefรผgt, das die ng-view-Direktive enthรคlt. AuรŸerdem stammt der Inhalt der Kursbeschreibung aus der โ€žTutorial-Variableโ€œ, die Teil des im AngularController definierten Scope-Objekts war.
  • Wenn man auf klickt Node.js Themen wird das gleiche Ergebnis erzielt und die Ansicht fรผr Node.js-Themen wird angezeigt.
  • Beachten Sie auรŸerdem, dass die Seite URL Die Route bleibt gleich. Nur die Route nach dem #-Tag รคndert sich, und das ist das Konzept von Single-Page-Anwendungen. Der #-Hash-Tag im URL ist ein Trennzeichen zwischen der Route (in unserem Fall 'Angular') und der Haupt-HTML-Seite (Sample.html).

AngularJS-Routing

Das Beispiel funktioniert nur, solange der Benutzer auf einen Link klickt, der einer registrierten Route entspricht. Im nรคchsten Abschnitt wird beschrieben, was passieren soll, wenn keine รœbereinstimmung gefunden wird.

Erstellen einer Standardroute in AngularJS

Routing in AngularJS bietet auch die Mรถglichkeit, eine Standardroute zu haben. Dies ist die Route, die ausgewรคhlt wird, wenn es keine รœbereinstimmung mit der vorhandenen Route gibt.

Die Standardroute wird erstellt, indem beim Definieren des Dienstes $routeProvider die folgende Bedingung hinzugefรผgt wird.

Die unten stehende Syntax bedeutet einfach, dass auf eine andere Seite umgeleitet wird, falls keine der vorhandenen Routen รผbereinstimmt.

otherwise({
  redirectTo: 'page'
});

Verwenden wir das gleiche Beispiel oben und fรผgen wir eine Standardroute zu unserem $routeProvider-Dienst hinzu.

Erstellen einer Standardroute in AngularJS

sampleApp.config(['$routeProvider',
function($routeProvider) {
  $routeProvider.
  when('/Angular', {
    templateUrl: 'Angular.html',
    controller: 'AngularController'
  }).
  when('/Node', {
    templateUrl: 'Node.html',
    controller: 'NodeController'
  }).
  otherwise({
    redirectTo: '/Angular'
  });
}]);

Code Erlรคuterung:

  1. Wir verwenden hier denselben Code wie oben, mit dem einzigen Unterschied, dass wir die `otherwise`-Anweisung und die Option `redirectTo` verwenden, um festzulegen, welche Ansicht geladen werden soll, wenn keine Route angegeben ist. In unserem Fall soll die Ansicht `/Angular` angezeigt werden.

Wenn der Code erfolgreich ausgefรผhrt wird, wird beim Ausfรผhren des Codes im Browser die folgende Ausgabe angezeigt.

Ausgang:

Erstellen einer Standardroute in AngularJS

Aus der Ausgabe,

  • Man kann deutlich sehen, dass die standardmรครŸig angezeigte Ansicht die AngularJS-Ansicht ist.
  • Dies liegt daran, dass beim Laden der Seite die Option โ€žAndernfallsโ€œ in der Funktion $routeProvider aufgerufen wird und die Ansicht โ€ž/Angularโ€œ geladen wird.

Eine Standardroute legt fest, welche Ansicht geladen wird. Im nรคchsten Abschnitt wird erlรคutert, wie eine einzelne Route viele Datensรคtze bedienen kann, indem sie einen Wert im URL.

So greifen Sie รผber die AngularJS-Route auf Parameter zu

Angular bietet auรŸerdem die Mรถglichkeit, Parameter wรคhrend des Routings zu รผbergeben. Die Parameter werden am Ende der Route hinzugefรผgt. URL, beispielsweise, http://guru99/index.html#/Angular/1. In diesem Angular-Routing-Beispiel:

  1. http://guru99/index.html ist unsere Hauptanwendung URL
  2. Das #-Symbol dient als Trennzeichen zwischen der Hauptanwendung URL und die Route
  3. Angular ist unsere Route
  4. Und schlieรŸlich ist โ€ž1โ€œ der Parameter, der unserer Route hinzugefรผgt wird

Die allgemeine Syntax lautet HTMLPage#/route/parameterDie frรผheren Themen werden also zu Sample.html#/Angular/1, #/Angular/2 und #/Angular/3, wobei die Ziffer die Themen-ID ist.

Schauen wir uns im Detail an, wie wir eine Angular-Route mit einem Parameter implementieren kรถnnen.

Schritt 1) โ€‹โ€‹Fรผgen Sie Ihrer Ansicht den folgenden Code hinzu

  1. Fรผge eine Tabelle hinzu, die dem Benutzer alle Themen des Angular JS-Kurses anzeigt.
  2. Fรผgen Sie eine Tabellenzeile zum Thema โ€žControllerโ€œ hinzu. Setzen Sie fรผr diese Zeile den href-Wert auf โ€ž#!/Angular/1โ€œ, sodass beim Klicken auf das Thema der Parameter 1 รผbergeben wird. URL entlang der Route.
  3. Fรผgen Sie eine Zeile fรผr das Thema โ€žModelleโ€œ hinzu, wobei der href-Wert auf โ€ž#!/Angular/2โ€œ gesetzt ist, sodass Parameter 2 in der URL.
  4. Fรผgen Sie eine Zeile fรผr das Thema โ€žDirektivenโ€œ hinzu, wobei der href-Wert auf โ€ž#!/Angular/3โ€œ gesetzt ist, sodass Parameter 3 im URL.

Zugriffsparameter รผber die AngularJS-Route

Schritt 2) Fรผgen Sie die Themen-ID in der RouteProvider-Dienstfunktion hinzu.
Fรผgen Sie in der routeProvider-Servicefunktion Folgendes hinzu: :topicId Platzhalter, der angibt, dass jeder รผbergebene Parameter im URL AnschlieรŸend sollte die Route der Variablen topicId zugewiesen werden.

Zugriffsparameter รผber die AngularJS-Route

Schritt 3) Fรผgen Sie dem Controller den erforderlichen Code hinzu

  1. Stellen Sie sicher, dass Sie beim Definieren der Controller-Funktion zuerst โ€ž$routeParamsโ€œ als Parameter hinzufรผgen. Dieser Parameter hat Zugriff auf alle รผbergebenen Routenparameter. URL.
  2. โ€ž$routeParamsโ€œ enthรคlt die in der Route รผbergebene Topic-ID. Anhรคngen $routeParams.topicId bis zum Umfang als $scope.tutorialid stellt es der Ansicht als tutorialid zur Verfรผgung.

Zugriffsparameter รผber die AngularJS-Route

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Event Registration</title>
</head>
<body ng-app="sampleApp">

<script src="https://code.angularjs.org/1.8.3/angular.min.js"></script>
<script src="https://code.angularjs.org/1.8.3/angular-route.js"></script>

<h1> Guru99 Global Event</h1>
<table class="table table-striped">
<tbody>
<tr><td>1</td><td>Controllers</td>
<td><a href="#!/Angular/1">Topic details</a></td></tr>
<!-- rows 2 and 3 repeat with /Angular/2 and /Angular/3 -->
</tbody>
</table>
<div ng-view></div>

<script>
var sampleApp = angular.module('sampleApp', ['ngRoute']);

sampleApp.config(['$routeProvider',
function($routeProvider) {
  $routeProvider.
  when('/Angular/:topicId', {
    templateUrl: 'Angular.html',
    controller: 'AngularController'
  });
}]);

sampleApp.controller('AngularController', ['$scope', '$routeParams',
function($scope, $routeParams) {
  $scope.tutorialid = $routeParams.topicId;
}]);
</script>
</body>
</html>

โš ๏ธ Korrekturen wurden vorgenommen. Im Original wurde der Buchstabe verwendet l anstelle der Ziffer 1 in href="#Angular/l", lieรŸ die ng-view Der Container war so beschaffen, dass die Vorlage nirgendwo gerendert werden konnte, und wurde geladen. angular-route.js bevor angular.min.jswas einen Modulfehler auslรถst.

Schritt 4) Fรผgen Sie den Ausdruck hinzu, um die Variable anzuzeigen.
Fรผgen Sie den Ausdruck hinzu, um die Variable โ€žtutorialidโ€œ auf der Seite โ€žAngular.htmlโ€œ anzuzeigen.

Zugriffsparameter รผber die AngularJS-Route

<h2>Angular</h2>

<br><br>{{tutorialid}}

Wenn der Code erfolgreich ausgefรผhrt wird, wird beim Ausfรผhren des Codes im Browser die folgende Ausgabe angezeigt.

Ausgang:

Zugriffsparameter รผber die AngularJS-Route

Im Ausgabebildschirm

  • Wenn Sie auf den Link โ€žThemendetailsโ€œ fรผr das erste Thema klicken, wird die Zahl 1 angehรคngt. URL.
  • Diese Zahl wird als โ€žrouteParamsโ€œ-Argument verwendet und ist im Controller zugรคnglich.

Das Auslesen eines Parameters ist unkompliziert. Das Abrufen des Datensatzes, den der Parameter identifiziert, bevor die Ansicht angezeigt wird, ist die Aufgabe der im Folgenden behandelten Eigenschaft.

Wie man Daten mit der resolve-Eigenschaft vorlรคdt

Der Controller im vorherigen Abschnitt liest eine Themen-ID und zeigt sie sofort an. Reale Anwendungen mรผssen den Datensatz zunรคchst von einem Server abrufen, und wenn die Ansicht gerendert wird, bevor diese Anfrage abgeschlossen ist, sieht der Benutzer eine leere Vorlage, die sich erst einen Moment spรคter fรผllt. resolve Die Eigenschaft entfernt dieses kurze Aufblitzen von leerem Inhalt.

Jeder Schlรผssel im Inneren eines resolve Das Objekt ist eine Abhรคngigkeit, die AngularJS vor der Aktivierung der Route vorbereitet. Handelt es sich bei dem Wert um ein Promise, wartet der Router auf dessen Auflรถsung. Erst wenn alle Promises aufgelรถst sind, instanziiert AngularJS den Controller und rendert die Vorlage. Die aufgelรถsten Werte werden dann, wie bei jedem anderen Service, per Namen in den Controller injiziert.

sampleApp.config(['$routeProvider',
function($routeProvider) {
  $routeProvider.
  when('/Angular/:topicId', {
    templateUrl: 'Angular.html',
    controller: 'AngularController',
    resolve: {
      // The router waits for this promise before rendering
      topic: ['$http', '$route', function($http, $route) {
        var id = $route.current.params.topicId;
        return $http.get('/api/topics/' + id).then(function(response) {
          return response.data;
        });
      }]
    }
  });
}]);

// 'topic' is injected already resolved, so no loading state is needed
sampleApp.controller('AngularController', ['$scope', 'topic',
function($scope, topic) {
  $scope.topic = topic;
}]);

Zwei Verhaltensweisen sind hier relevant. Ein abgelehntes Promise bricht den Routenwechsel ab und belรคsst den Browser in der aktuellen Ansicht, sodass eine fehlgeschlagene Anfrage niemals zu einer fehlerhaften Seite fรผhrt. Da der Router jedoch blockiert, solange das Promise aussteht, lรคsst ein langsamer Endpunkt die Anwendung einfrieren. resolve mit einem Fortschrittsindikator, der von der $routeChangeStart und $routeChangeSuccess Veranstaltungen.

โš ๏ธ Warnung: Platzieren Sie Authentifizierungsprรผfungen niemals nur innerhalb resolveDas Ablehnen einer Route blendet zwar eine Ansicht aus, schรผtzt aber nicht die dahinterliegenden Daten, und der API-Endpunkt muss weiterhin den Zugriff auf dem Server erzwingen.

Neben dem Vorladen von Daten kann eine Route auch statische Konfigurationswerte enthalten. Der nachfolgend beschriebene Dienst zeigt, wie ein Controller diese Werte ausliest.

So verwenden Sie den Angular $route-Dienst

Der Dienst `$route` ermรถglicht den Zugriff auf die Eigenschaften einer Route. Er steht als Parameter zur Verfรผgung, wenn die Funktion im Controller definiert wird. Die allgemeine Syntax fรผr die Verwendung des Parameters `$route` im Controller wird im Folgenden dargestellt.

myApp.controller('MyController', function($scope, $route) { ... });
  1. myApp ist das fรผr Ihre Anwendung definierte AngularJS-Modul.
  2. MyController ist der Name des fรผr Ihre Anwendung definierten Controllers.
  3. So wie $scope Informationen vom Controller an die Ansicht weitergibt, stellt $route die Eigenschaften der aktuellen Route bereit.

Schauen wir uns an, wie wir den $route-Dienst nutzen kรถnnen.

In diesem Beispiel

  • Wir werden eine einfache benutzerdefinierte Variable namens โ€žmytextโ€œ erstellen, die die Zeichenfolge โ€žThis is Angularโ€œ enthรคlt.
  • Wir werden diese Variable an unsere Route anhรคngen. Later Wir werden รผber den $route-Dienst von unserem Controller auf diese Zeichenkette zugreifen und sie dann mithilfe des Scope-Objekts in unserer Ansicht anzeigen.

Sehen wir uns also die Schritte an, die wir ausfรผhren mรผssen, um dies zu erreichen.

Schritt 1) Fรผgen Sie der Route ein benutzerdefiniertes Schlรผssel-Wert-Paar hinzu. Hier fรผgen wir einen Schlรผssel namens โ€žmytextโ€œ hinzu und weisen ihm den Wert โ€žThis is Angularโ€œ zu.

Angular $route-Dienst

Schritt 2) Fรผgen Sie den entsprechenden Code zum Controller hinzu.

  1. Fรผgen Sie den Parameter `$route` zur Controller-Funktion hinzu. Der Parameter `$route` ist ein wichtiger Parameter in Angular, der den Zugriff auf die Eigenschaften der Route ermรถglicht.
  2. Auf die Variable โ€žmytextโ€œ, die in der Route definiert wurde, kann รผber die Referenz $route.current zugegriffen werden. Dieser wird dann der Variablen โ€žtextโ€œ des Scope-Objekts zugewiesen. Auf die Textvariable kann dann entsprechend aus der Ansicht zugegriffen werden.

Angular $route-Dienst

// Only the config and controller change; the page markup is unchanged
sampleApp.config(['$routeProvider',
function($routeProvider) {
  $routeProvider.
  when('/Angular/:topicId', {
    mytext: "This is angular",   // custom key attached to the route
    templateUrl: 'Angular.html',
    controller: 'AngularController'
  });
}]);

sampleApp.controller('AngularController', ['$scope', '$routeParams', '$route',
function($scope, $routeParams, $route) {
  $scope.tutorialid = $routeParams.topicId;
  $scope.text = $route.current.mytext;
}]);

Schritt 3) Fรผgen Sie einen Verweis auf die Textvariable aus dem Bereichsobjekt als Ausdruck hinzu. Dies wird wie unten gezeigt zu unserer Angular.html-Seite hinzugefรผgt.

Dadurch wird der Text โ€žThis is angleโ€œ in die Ansicht eingefรผgt. Der {{tutorialid}}-Ausdruck ist derselbe wie im vorherigen Thema und zeigt die Zahl โ€ž1โ€œ an.

Angular $route-Dienst

<h2>Angular</h2>

<br><br>{{text}}
<br><br>{{tutorialid}}

Wenn der Code erfolgreich ausgefรผhrt wird, wird beim Ausfรผhren des Codes im Browser die folgende Ausgabe angezeigt.

Ausgang:

Angular $route-Dienst

Aus der Ausgabe,

  • Wir kรถnnen sehen, dass der Text โ€žDies ist Angularโ€œ auch angezeigt wird, wenn wir auf einen der Links in der Tabelle klicken. Die Themen-ID wird gleichzeitig mit dem Text angezeigt.

Jede URL Die bisherige Darstellung enthรคlt noch ein #-Symbol. Im letzten Konfigurationsschritt wird es entfernt.

Aktivieren des HTML5-Routings

HTML5-Routing wird verwendet, um saubere URLs. Es bedeutet die Entfernung des Hashtags aus dem URLDie Weiterleitung erfolgt also URLWenn HTML5-Routing verwendet wird, wรผrde dies wie unten dargestellt aussehen.

Sample.html/Angular/1

Sample.html/Angular/2

Sample.html/Angular/3

Dieses Konzept ist gemeinhin als die Prรคsentation eines hรผbschen URL fรผr den Benutzer.

Es gibt zwei Hauptschritte, die fรผr das HTML2-Routing ausgefรผhrt werden mรผssen.

  1. Konfigurieren von $locationProvider
  2. Wir legen unsere Basis fรผr relative Links fest

Schauen wir uns nun genauer an, wie die oben genannten Schritte in unserem Beispiel durchzufรผhren sind.

Schritt 1) Fรผgen Sie den entsprechenden Code zum Angular-Modul hinzu.

  1. Hinzufรผgen <base> Fรผgen Sie dem Dokumentkopf ein Tag hinzu. Dies ist fรผr das HTML5-Routing erforderlich, damit die Anwendung ihren Basisspeicherort kennt.
  2. Fรผgen Sie den Dienst $locationProvider hinzu. Mit diesem Dienst kรถnnen Sie den html5Mode definieren.
  3. Setzen Sie den html5Mode des $locationProvider-Dienstes auf true.

Aktivieren des HTML5-Routings

Schritt 2) Entfernen Sie alle #-Tags vor den Links (โ€žAngular/1โ€œ, โ€žAngular/2โ€œ, โ€žAngular/3โ€œ), um eine lesbare Darstellung zu gewรคhrleisten. URLs.

Aktivieren des HTML5-Routings

<!-- In the head: required by html5Mode so relative templates resolve -->
<base href="/">

<!-- In the body: the # is dropped from every link -->
<a href="Angular/1">Topic details</a>

<script>
sampleApp.config(['$routeProvider', '$locationProvider',
function($routeProvider, $locationProvider) {
  $locationProvider.html5Mode(true);
  $routeProvider.
  when('/Angular/:topicId', {
    templateUrl: 'Angular.html',
    controller: 'AngularController'
  });
}]);
</script>

โš ๏ธ Korrektur: Das Original erklรคrte ein baseUrl Eine Konstante verweist auf einen lokalen IDE-Pfad, der keinen Einfluss auf html5Mode hat. AngularJS liest den Basispfad aus dem <base href> Etikett. Das Original wurde ebenfalls eingefรผgt. $locationProvider ohne jemals anzurufen html5Mode(true)Der Hash wurde also nie entfernt.

Wenn der Code erfolgreich ausgefรผhrt wird, wird beim Ausfรผhren des Codes im Browser die folgende Ausgabe angezeigt.

Ausgang:

Aktivieren des HTML5-Routings

Aus der Ausgabe,

  • Sie kรถnnen sehen, dass das #-Tag nicht vorhanden ist, wenn Sie auf die Anwendung zugreifen.

Alle oben genannten Beispiele verwenden ngRoute, den vom AngularJS-Team mitgelieferten Router. Es ist jedoch nicht die einzige Option, und der folgende Vergleich erklรคrt, wann die Alternative besser geeignet ist.

ngRoute vs ui-router: Welchen Router soll ich wรคhlen?

ngRoute wird vom AngularJS-Team gepflegt und entspricht einem URL direkt zu einer einzigen Vorlage und einem einzigen Controller. ui-router ist ein Community-Projekt, das entwickelt wurde, um die Hauptbeschrรคnkung von ngRoute zu beseitigen: Es passt auf die Anwendung. Zustand eher als auf der URL allein, wodurch ein Bildschirm mehrere unabhรคngig geroutete Bereiche enthalten kann.

Aspekt ngRoute ui-router
Konfigurationsdienst $routeProvider $stateProvider
Spiele am URL einzige Benannter Staat, URL optional
Verschachtelte Ansichten Nicht unterstรผtzt Unterstรผtzt
Mehrere Ansichten pro Bildschirm Eine ng-Ansicht Viele benannte UI-View-Outlets
Verschachtelte Auflรถsung Nicht unterstรผtzt Kindzustรคnde erben die Auflรถsungen des Elternzustands
am besten geeignet fรผr Flache, kleine Anwendungen Dashboards und mehrschichtige Layouts

Wรคhle ngRoute, wenn jedes URL Die Darstellung erfolgt auf einer einzigen Seite, da keine zusรคtzlichen Abhรคngigkeiten benรถtigt werden und die gesamte API auf eine Seite passt. Wรคhlen Sie ui-router, wenn ein Bildschirm Bereiche enthรคlt, die unabhรคngig voneinander navigieren, oder wenn untergeordnete Ansichten Daten wiederverwenden mรผssen, die von einem รผbergeordneten Element geladen wurden. Eine spรคtere Migration ist zwar mรถglich, aber nicht trivial, da die Zustandsnamen ersetzt werden. URL Muster durchziehen die Vorlagen.

Hรคufige Routing-Fehler in AngularJS und wie man sie behebt

Die meisten Routing-Fehler fรผhren zu einer leeren ng-view-Ansicht anstelle einer Konsolenfehlermeldung, was die Diagnose unnรถtig erschwert. Jedes Symptom wird im Folgenden mit seiner Ursache und Lรถsung beschrieben.

  • Unbekannter Anbieter: $routeProvider: angular-route.js wurde entweder nie geladen oder vor angular.min.js geladen. Bitte laden Sie zuerst die Kernbibliothek.
  • Die Ansicht bleibt leer, ohne dass eine Fehlermeldung angezeigt wird: Kein Element enthรคlt die ng-view-Direktive, daher hat die Vorlage keinen Ort, an dem sie gerendert werden kann.
  • Beim ersten Besuch lรคdt nichts: Es gibt keine passende Route fรผr den leeren Pfad. Fรผgen Sie einen โ€žotherwiseโ€œ-Block mit einem โ€žredirectToโ€œ-Wert hinzu.
  • $routeParams ist leer: Dem Muster fehlt der Doppelpunkt-Platzhalter. Es muss '/Angular/:topicId' lauten.
  • Templates 404 nach html5Mode: Konfigurieren Sie den Server so, dass nicht รผbereinstimmende Pfade auf die Basisseite umgeschrieben werden, und stellen Sie sicher, dass das Basis-href-Tag vorhanden ist.
  • Der Controller wird nie erneut ausgefรผhrt: Da sich nur der Parameter geรคndert hatte, nutzte AngularJS die Controller-Instanz wieder, anstatt sie neu zu erstellen. Anstatt darauf zu warten, dass die Controller-Funktion erneut aufgerufen wird, wird auf das `$routeUpdate`-Ereignis reagiert.

Hรคufig gestellte Fragen

`$routeParams` gibt sowohl Pfadplatzhalter als auch Abfragezeichenfolgenwerte in einem Objekt zurรผck. `$location.search()` gibt hingegen nur die Abfragezeichenfolge zurรผck. Verwenden Sie `$routeParams` innerhalb von Controllern und `$location.search()` beim direkten Lesen oder Schreiben von Abfragewerten.

Ja. Ohne den Hash sendet der Browser beim Aktualisieren oder beim Aufrufen eines geteilten Links den vollstรคndigen Pfad an den Server. Der Server muss jeden nicht รผbereinstimmenden Pfad zurรผck zur Basis-HTML-Seite umschreiben, andernfalls liefern Deep Links einen 404-Fehler.

AngularJS hat im Dezember 2021 das Ende seines Lebenszyklus erreicht und erhรคlt keine weiteren Updates mehr. ngRoute eignet sich weiterhin zur Wartung bestehender AngularJS-Anwendungen, neue Projekte sollten jedoch ein aktuell unterstรผtztes Framework verwenden.

Ja. AI Assistenten ordnen jeden WHEN-Block einem Eintrag im Routes-Array zu und รผbersetzen Resolve-Schlรผssel in Routen-Resolver. RevView Guards und Wildcard-Handling mรผssen manuell konfiguriert werden, da die beiden Router nicht รผbereinstimmende Pfade unterschiedlich behandeln.

KI-Tools รผberprรผfen die drei รผblichen Ursachen nacheinander: eine fehlende ngRoute-Abhรคngigkeit, ein fehlendes ng-view-Element und ein Routenmuster, das nicht รผbereinstimmt. URLDie Beschreibung des Symptoms und das Einfรผgen des Konfigurationsblocks helfen in der Regel, den Fehler einzugrenzen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: