Ici, il utilise pathmatch comme complet et lorsque je supprime ce pathmatch, il ne charge même pas l'application ou n'exécute pas le projet
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
la source
la source
Réf: https://angular.io/guide/router#set-up-redirects
pathMatch: 'full'
signifie que tout le chemin de l'URL doit correspondre et est consommé par l'algorithme de correspondance d'itinéraire.pathMatch: 'prefix'
signifie que la première route où le chemin correspond au début de l'URL est choisie, mais alors l'algorithme de correspondance d'itinéraire continue à rechercher des routes enfants correspondantes là où le reste de l'URL correspond.la source
Bien que techniquement correctes, les autres réponses bénéficieraient d'une explication de la correspondance URL-route d'Angular. Je ne pense pas que vous puissiez pleinement (pardonnez le jeu de mots) comprendre ce qui se
pathMatch: full
passe si vous ne savez pas comment le routeur fonctionne en premier lieu.Définissons d'abord quelques éléments de base. Nous allons utiliser cette URL comme exemple:
/users/james/articles?from=134#section
.Cela peut être évident, mais soulignons d'abord que les paramètres de requête (
?from=134
) et fragments (#section
) ne jouent aucun rôle dans la correspondance de chemin . Seule l'url de base (/users/james/articles
) compte.Angular divise les URL en segments . Les segments de
/users/james/articles
sont, bien sûrusers
,james
etarticles
.La configuration du routeur est une arborescence avec un seul nœud racine. Chaque
Route
objet est un nœud, qui peut avoir deschildren
nœuds, qui peuvent à leur tour en avoir d'autreschildren
ou être des nœuds feuilles.Le but du routeur est de trouver une branche de configuration du routeur , en commençant par le nœud racine, qui correspondrait exactement à tous les segments (!!!) de l'URL. C'est crucial! Si Angular ne trouve pas de branche de configuration d'itinéraire qui pourrait correspondre à l' URL entière - ni plus ni moins - il ne rendra rien .
Par exemple, si votre URL cible est
/a/b/c
mais que le routeur ne peut correspondre qu'à l'un/a/b
ou l' autre/a/b/c/d
, alors il n'y a pas de correspondance et l'application ne rendra rien.Enfin, les itinéraires avec
redirectTo
se comportent légèrement différemment des itinéraires réguliers, et il me semble qu'ils seraient le seul endroit où quiconque voudrait vraiment utiliserpathMatch: full
. Mais nous y reviendrons plus tard.prefix
Correspondance de chemin par défaut ( )Le raisonnement derrière le nom
prefix
est qu'une telle configuration d'itinéraire vérifiera si le configurépath
est un préfixe des segments d'URL restants. Cependant, le routeur ne peut faire correspondre que des segments complets , ce qui rend cette dénomination légèrement confuse.Quoi qu'il en soit, disons que c'est notre configuration de routeur au niveau racine:
Notez que chaque
Route
objet utilise ici la stratégie de correspondance par défaut, qui estprefix
. Cette stratégie signifie que le routeur effectue une itération sur l'ensemble de l'arborescence de configuration et essaie de la comparer à l'URL cible segment par segment jusqu'à ce que l'URL soit entièrement mise en correspondance . Voici comment cela serait fait pour cet exemple:users
.'products' !== 'users'
, alors sautez cette branche. Notez que nous utilisons un contrôle d'égalité plutôt qu'un.startsWith()
ou.includes()
- seuls les segments complets comptent!:other
correspond à n'importe quelle valeur, donc c'est une correspondance. Cependant, l'URL cible n'est pas encore entièrement appariée (nous devons encore faire correspondrejames
etarticles
), le routeur recherche donc des enfants.:other
esttricks
, qui n'est!== 'james'
donc pas une correspondance.'user' !== 'users
, sauter la branche.'users' === 'users
- le segment correspond. Cependant, ce n'est pas encore une correspondance complète, nous devons donc rechercher des enfants (comme à l'étape 3).'permissions' !== 'james'
, sauter.:userID
correspond à tout, nous avons donc une correspondance pour lejames
segment. Cependant, ce n'est toujours pas une correspondance complète, nous devons donc rechercher un enfant qui correspondraitarticles
.:userID
a une route enfantarticles
, ce qui nous donne une correspondance complète! Ainsi, l'application rendUserArticlesComponent
.full
Correspondance URL complète ( )Exemple 1
Imaginez maintenant que l'
users
objet de configuration de la route ressemblait à ceci:Notez l'utilisation de
pathMatch: full
. Si tel était le cas, les étapes 1 à 5 seraient les mêmes, mais l'étape 6 serait différente:'users' !== 'users/james/articles
- le segment ne correspond pas car la configuration du cheminusers
avecpathMatch: full
ne correspond pas à l'URL complète, qui estusers/james/articles
.Exemple 2
Et si nous avions ceci à la place:
users/:userID
avec despathMatch: full
allumettes seulementusers/james
, c'est donc à nouveau une non-correspondance, et l'application ne rend rien.Exemple 3
Considérons ceci:
Dans ce cas:
'users' === 'users
- le segment correspond, maisjames/articles
reste toujours inégalé. Cherchons des enfants.'permissions' !== 'james'
- sauter.:userID'
ne peut correspondre qu'à un seul segment, ce qui seraitjames
. Cependant, c'est unepathMatch: full
route, et elle doit correspondrejames/articles
(toute l'URL restante). Ce n'est pas capable de faire ça et donc ce n'est pas un match (donc on saute cette branche)!Comme vous l'avez peut-être remarqué, une
pathMatch: full
configuration dit essentiellement ceci:Redirige
Tout
Route
ce qui a défini unredirectTo
sera comparé à l'URL cible selon les mêmes principes. La seule différence ici est que la redirection est appliquée dès qu'un segment correspond . Cela signifie que si une route de redirection utilise laprefix
stratégie par défaut , une correspondance partielle suffit à provoquer une redirection . Voici un bon exemple:Pour notre URL initiale (
/users/james/articles
), voici ce qui se passerait:'not-found' !== 'users'
- sauter.'users' === 'users'
- nous avons un match.redirectTo: 'not-found'
, qui est appliqué immédiatement .not-found
.not-found
immédiatement une correspondance. L'application rendNotFoundComponent
.Considérez maintenant ce qui se passerait si l'
users
itinéraire avait égalementpathMatch: full
:'not-found' !== 'users'
- sauter.users
correspondrait au premier segment de l'URL, mais la configuration de l'itinéraire nécessite unefull
correspondance, donc ignorez-la.'users/:userID'
matchsusers/james
.articles
ne correspond toujours pas mais cet itinéraire a des enfants.articles
les enfants. L'URL entière est maintenant mise en correspondance et l'application est rendueUserArticlesComponent
.Chemin vide (
path: ''
)Le chemin vide est un peu un cas particulier car il peut correspondre à n'importe quel segment sans le «consommer» (donc ses enfants devraient à nouveau correspondre à ce segment). Prenons cet exemple:
Disons que nous essayons d'accéder
/users
:path: ''
correspondra toujours, donc l'itinéraire correspond. Cependant, toute l'URL n'a pas été mise en correspondance - nous devons encore faire correspondreusers
!users
, qui correspond au segment restant (et seulement!) Et nous avons une correspondance complète. L'application rendBadUsersComponent
.Revenons maintenant à la question initiale
L'OP a utilisé cette configuration de routeur:
Si nous naviguons vers l'URL racine (
/
), voici comment le routeur résoudrait cela:welcome
ne correspond pas à un segment vide, alors ignorez-le.path: ''
correspond au segment vide. Il a unpathMatch: 'full'
, qui est également satisfait car nous avons fait correspondre l'URL entière (il y avait un seul segment vide).welcome
produit et l'application s'afficheWelcomeComponent
.Et s'il n'y avait pas
pathMatch: 'full'
?En fait, on s'attendrait à ce que tout se comporte exactement de la même manière. Cependant, Angular empêche explicitement une telle configuration (
{ path: '', redirectTo: 'welcome' }
) car si vous mettez celaRoute
ci - dessuswelcome
, cela créerait théoriquement une boucle sans fin de redirections. Donc Angular jette juste une erreur , c'est pourquoi l'application ne fonctionnerait pas du tout! ( https://angular.io/api/router/Route#pathMatch )Cela n'a vraiment pas trop de sens car Angular a implémenté une protection contre les redirections sans fin - il n'exécute qu'une seule redirection par niveau de routage.
Et quoi
path: '**'
?path: '**'
correspondra absolument à tout (af/frewf/321532152/fsa
est une correspondance) avec ou sans apathMatch: 'full'
, il est donc inutile d'utiliser cette option de configuration.De plus, comme il correspond à tout, le chemin racine est également inclus, ce qui rend
{ path: '', redirectTo: 'welcome' }
redondant dans cette configuration.Curieusement, c'est parfaitement bien d'avoir cette configuration:
Si nous naviguons vers
/welcome
, il ypath: '**'
aura un match et une redirection vers la bienvenue se produira. Cela devrait lancer une boucle sans fin de redirections, mais Angular arrête cela immédiatement et tout fonctionne bien.la source
La stratégie de correspondance de chemin, l'une parmi 'prefix' ou 'full'. La valeur par défaut est «préfixe».
Par défaut, le routeur vérifie les éléments d'URL de la gauche pour voir si l'URL correspond à un chemin donné, et s'arrête lorsqu'il y a une correspondance. Par exemple, «/ équipe / 11 / utilisateur» correspond à «équipe /: id».
La stratégie de correspondance de chemin "complète" correspond à l'URL entière. Il est important de le faire lors de la redirection de routes à chemin vide. Sinon, comme un chemin vide est le préfixe de n'importe quelle URL, le routeur appliquerait la redirection même lors de la navigation vers la destination de la redirection, créant une boucle sans fin.
Source: https://angular.io/api/router/Route#properties
la source