Hier wird Pathmatch als voll verwendet und wenn ich diesen Pathmatch lösche, wird nicht einmal die App geladen oder das Projekt ausgeführt
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpModule } from '@angular/http';
import { RouterModule } from '@angular/router';
import { AppComponent } from './app.component';
import { WelcomeComponent } from './home/welcome.component';
/* Feature Modules */
import { ProductModule } from './products/product.module';
@NgModule({
imports: [
BrowserModule,
HttpModule,
RouterModule.forRoot([
{ path: 'welcome', component: WelcomeComponent },
{ path: '', redirectTo: 'welcome', pathMatch: 'full' },
{ path: '**', redirectTo: 'welcome', pathMatch: 'full' }
]),
ProductModule
],
declarations: [
AppComponent,
WelcomeComponent
],
bootstrap: [ AppComponent ]
})
export class AppModule { }
angular
typescript
GCJAmarasinghe
quelle
quelle
Ref: https://angular.io/guide/router#set-up-redirects
pathMatch: 'full'
bedeutet, dass der gesamte URL-Pfad übereinstimmen muss und vom Routenanpassungsalgorithmus verwendet wird.pathMatch: 'prefix'
bedeutet, dass die erste Route ausgewählt wird, bei der der Pfad mit dem Beginn der URL übereinstimmt, der Routenanpassungsalgorithmus jedoch weiterhin nach übereinstimmenden untergeordneten Routen sucht, bei denen der Rest der URL übereinstimmt.quelle
Obwohl technisch korrekt, würden die anderen Antworten von einer Erklärung des URL-zu-Route-Abgleichs von Angular profitieren. Ich glaube nicht, dass Sie vollständig verstehen können (entschuldigen Sie das Wortspiel), was
pathMatch: full
passiert, wenn Sie nicht wissen, wie der Router überhaupt funktioniert.Lassen Sie uns zunächst einige grundlegende Dinge definieren. Wir werden diese URL als Beispiel verwenden :
/users/james/articles?from=134#section
.Es mag offensichtlich sein, aber lassen Sie uns zunächst darauf hinweisen, dass die Abfrageparameter (
?from=134
) und Fragmente (#section
) beim Pfadabgleich keine Rolle spielen . Nur die Basis-URL (/users/james/articles
) ist wichtig.Angular teilt URLs in Segmente auf . Die Segmente
/users/james/articles
sind, natürlichusers
,james
undarticles
.Die Routerkonfiguration ist eine Baumstruktur mit einem einzelnen Stammknoten. Jedes
Route
Objekt ist ein Knoten, derchildren
Knoten haben kann , die wiederum anderechildren
oder Blattknoten haben können.Das Ziel des Routers ist es, einen Router - Konfiguration zu finden Zweig , am Wurzelknoten beginnen, die passen würden genau all (!!!) Segmente der URL. Das ist entscheidend! Wenn Angular keine Route Konfigurationszweig finden , die die passen könnten ganze URL - nicht mehr und nicht weniger - es wird nicht machen nichts .
Wenn beispielsweise Ihre Ziel-URL lautet
/a/b/c
, der Router jedoch nur entweder/a/b
oder übereinstimmen kann/a/b/c/d
, gibt es keine Übereinstimmung, und die Anwendung rendert nichts.Schließlich
redirectTo
verhalten sich Routen mit etwas anders als normale Routen, und es scheint mir, dass sie der einzige Ort sind, an dem jemand wirklich jemals etwas nutzen möchtepathMatch: full
. Aber wir werden später darauf zurückkommen.Standard (
prefix
) PfadübereinstimmungDer Grund für den Namen
prefix
ist, dass eine solche Routenkonfiguration prüft, ob die Konfigurationpath
ein Präfix der verbleibenden URL-Segmente ist. Der Router kann jedoch nur vollständige Segmente abgleichen , was diese Benennung etwas verwirrend macht.Nehmen wir an, dies ist unsere Routerkonfiguration auf Root-Ebene:
Beachten Sie, dass jedes einzelne
Route
Objekt hier die Standard-Matching-Strategie verwendetprefix
. Diese Strategie bedeutet, dass der Router den gesamten Konfigurationsbaum durchläuft und versucht, ihn segmentweise mit der Ziel-URL abzugleichen, bis die URL vollständig übereinstimmt . So würde es für dieses Beispiel gemacht:users
.'products' !== 'users'
Überspringen Sie also diesen Zweig. Beachten Sie, dass wir eine Gleichheitsprüfung anstelle einer.startsWith()
oder verwenden.includes()
- nur vollständige Segmentübereinstimmungen zählen!:other
Entspricht einem beliebigen Wert, es ist also eine Übereinstimmung. Die Ziel-URL ist jedoch noch nicht vollständig übereinstimmend (wir müssen noch übereinstimmenjames
undarticles
), daher sucht der Router nach untergeordneten Elementen.:other
isttricks
, was!== 'james'
daher kein Match ist.'user' !== 'users
, Zweig überspringen.'users' === 'users
- Das Segment stimmt überein. Dies ist jedoch noch keine vollständige Übereinstimmung, daher müssen wir nach Kindern suchen (wie in Schritt 3).'permissions' !== 'james'
, überspring es.:userID
passt zu allem, also haben wir eine Übereinstimmung für dasjames
Segment. Dies ist jedoch immer noch keine vollständige Übereinstimmung, daher müssen wir nach einem passenden Kind suchenarticles
.:userID
es eine Kinderroutearticles
gibt, die uns eine vollständige Übereinstimmung gibt! Somit wird die Anwendung gerendertUserArticlesComponent
.Vollständige
full
Übereinstimmung von URL ( )Beispiel 1
Stellen Sie sich jetzt vor, dass das
users
Routenkonfigurationsobjekt folgendermaßen aussieht:Beachten Sie die Verwendung von
pathMatch: full
. Wenn dies der Fall wäre, wären die Schritte 1 bis 5 gleich, jedoch wäre Schritt 6 anders:'users' !== 'users/james/articles
- Das Segment stimmt nicht überein, da die Pfadkonfigurationusers
mitpathMatch: full
nicht mit der vollständigen URL übereinstimmtusers/james/articles
.Beispiel 2
Was wäre, wenn wir dies stattdessen hätten:
users/:userID
pathMatch: full
Nur mit Übereinstimmungen istusers/james
es also wieder eine Nichtübereinstimmung, und die Anwendung rendert nichts.Beispiel 3
Betrachten wir Folgendes:
In diesem Fall:
'users' === 'users
- Das Segment stimmt überein,james/articles
bleibt aber unübertroffen. Lass uns nach Kindern suchen.'permissions' !== 'james'
- überspringen.:userID'
kann nur einem einzelnen Segment entsprechen, was wärejames
. Es handelt sich jedoch um einepathMatch: full
Route, die übereinstimmen mussjames/articles
(die gesamte verbleibende URL). Das kann es nicht und daher ist es kein Match (also überspringen wir diesen Zweig)!Wie Sie vielleicht bemerkt haben,
pathMatch: full
sagt eine Konfiguration im Grunde Folgendes:Weiterleitungen
Alle,
Route
die a definiertredirectTo
haben, werden nach denselben Prinzipien mit der Ziel-URL abgeglichen. Der einzige Unterschied besteht darin, dass die Umleitung angewendet wird, sobald ein Segment übereinstimmt . Dies bedeutet, dass, wenn eine Umleitungsroute die Standardstrategie verwendetprefix
, eine teilweise Übereinstimmung ausreicht, um eine Umleitung zu verursachen . Hier ist ein gutes Beispiel:Für unsere ursprüngliche URL (
/users/james/articles
) würde Folgendes passieren:'not-found' !== 'users'
- überspring es.'users' === 'users'
- Wir haben ein Match.redirectTo: 'not-found'
, die sofort angewendet wird .not-found
.not-found
sofort einen Abgleich für . Die Anwendung wird gerendertNotFoundComponent
.Überlegen Sie nun, was passieren würde, wenn die
users
Route auch Folgendes hättepathMatch: full
:'not-found' !== 'users'
- überspring es.users
würde mit dem ersten Segment der URL übereinstimmen, aber die Routenkonfiguration erfordert einefull
Übereinstimmung. Überspringen Sie sie daher.'users/:userID'
Streichhölzerusers/james
.articles
ist immer noch nicht abgestimmt, aber diese Route hat Kinder.articles
die Kinder. Die gesamte URL wird jetzt abgeglichen und die Anwendung wird gerendertUserArticlesComponent
.Leerer Pfad (
path: ''
)Der leere Pfad ist ein Sonderfall, da er mit jedem Segment übereinstimmen kann , ohne es zu "verbrauchen" (daher müssten seine Kinder diesem Segment erneut entsprechen). Betrachten Sie dieses Beispiel:
Nehmen wir an, wir versuchen zuzugreifen
/users
:path: ''
wird immer übereinstimmen, daher stimmt die Route überein. Es wurde jedoch nicht die gesamte URL abgeglichen - wir müssen noch übereinstimmenusers
!users
, das dem verbleibenden (und einzigen!) Segment entspricht, und wir haben eine vollständige Übereinstimmung. Die Anwendung wird gerendertBadUsersComponent
.Nun zurück zur ursprünglichen Frage
Das OP verwendete diese Routerkonfiguration:
Wenn wir zur Root-URL (
/
) navigieren, würde der Router dies folgendermaßen beheben:welcome
stimmt nicht mit einem leeren Segment überein, überspringen Sie es also.path: ''
entspricht dem leeren Segment. Es hat einepathMatch: 'full'
, was auch zufrieden ist, da wir die gesamte URL abgeglichen haben (es hatte ein einzelnes leeres Segment).welcome
erfolgt und die Anwendung wird gerendertWelcomeComponent
.Was wäre, wenn es keine gäbe
pathMatch: 'full'
?Eigentlich würde man erwarten, dass sich das Ganze genauso verhält. Allerdings Angular explizit verhindert eine solche Konfiguration (
{ path: '', redirectTo: 'welcome' }
) , weil , wenn Sie diese setzenRoute
obenwelcome
, wäre es theoretisch eine Endlosschleife von Umleitungen erstellen. Angular gibt also nur einen Fehler aus , weshalb die Anwendung überhaupt nicht funktionieren würde! ( https://angular.io/api/router/Route#pathMatch )Dies ist wirklich nicht sehr sinnvoll, da Angular einen Schutz gegen endlose Weiterleitungen implementiert hat - es wird nur eine einzige Umleitung pro Routing-Ebene ausgeführt.
Was ist mit
path: '**'
?path: '**'
passt absolut zu allem (af/frewf/321532152/fsa
ist eine Übereinstimmung) mit oder ohne apathMatch: 'full'
, daher macht es keinen Sinn, diese Konfigurationsoption zu verwenden.Da es mit allem übereinstimmt, ist auch der Stammpfad enthalten, was
{ path: '', redirectTo: 'welcome' }
in diesem Setup überflüssig wird.Lustigerweise ist es vollkommen in Ordnung, diese Konfiguration zu haben:
Wenn wir zu navigieren
/welcome
,path: '**'
wird ein Match stattfinden und eine Weiterleitung zur Begrüßung wird stattfinden. Dies sollte eine endlose Schleife von Weiterleitungen auslösen, aber Angular stoppt dies sofort und das Ganze funktioniert einwandfrei.quelle
Die Pfadanpassungsstrategie, entweder "Präfix" oder "Voll". Standard ist 'Präfix'.
Standardmäßig überprüft der Router die URL-Elemente von links, um festzustellen, ob die URL mit einem bestimmten Pfad übereinstimmt, und stoppt, wenn eine Übereinstimmung vorliegt. Zum Beispiel entspricht '/ team / 11 / user' 'team /: id'.
Die Pfadübereinstimmungsstrategie "Voll" stimmt mit der gesamten URL überein. Dies ist wichtig, wenn Sie Routen mit leeren Pfaden umleiten. Andernfalls wendet der Router die Umleitung an, da ein leerer Pfad ein Präfix einer beliebigen URL ist, auch wenn er zum Umleitungsziel navigiert, wodurch eine Endlosschleife erstellt wird.
Quelle: https://angular.io/api/router/Route#properties
quelle