Aquí está el uso de pathmatch como completo y cuando elimino este pathmatch ni siquiera carga la aplicación o ejecuta el proyecto
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
fuente
fuente

Ref: https://angular.io/guide/router#set-up-redirects
pathMatch: 'full'significa que toda la ruta de la URL debe coincidir y es consumida por el algoritmo de coincidencia de rutas.pathMatch: 'prefix'es decir, se elige la primera ruta donde la ruta coincide con el inicio de la URL, pero luego el algoritmo de coincidencia de rutas continúa buscando rutas secundarias coincidentes donde el resto de la URL coincide.fuente
Si bien es técnicamente correcto, las otras respuestas se beneficiarían de una explicación de la coincidencia de URL a ruta de Angular. No creo que puedas entender completamente (perdón por el juego de palabras) lo que
pathMatch: fullhace si no sabes cómo funciona el enrutador en primer lugar.Primero definamos algunas cosas básicas. Vamos a utilizar esta URL como ejemplo:
/users/james/articles?from=134#section.Puede ser obvio, pero primero señalemos que los parámetros de consulta (
?from=134) y los fragmentos (#section) no juegan ningún papel en la coincidencia de rutas . Solo/users/james/articlesimporta la URL base ( ).Angular divide las URL en segmentos . Los segmentos de
/users/james/articlesson, por supuestousers,jamesyarticles.La configuración del enrutador es una estructura de árbol con un solo nodo raíz. Cada
Routeobjeto es un nodo, que puede tenerchildrennodos, que a su vez pueden tener otroschildreno ser nodos hoja.El objetivo del enrutador es encontrar una rama de configuración del enrutador , comenzando en el nodo raíz, que coincidiría exactamente con todos los segmentos (!!!) de la URL. ¡Esto es crucial! Si Angular no encuentra una rama de configuración de ruta que pueda coincidir con la URL completa , ni más ni menos , no generará nada .
Por ejemplo, si su URL de destino es
/a/b/cpero el enrutador solo puede coincidir con/a/bo/a/b/c/d, entonces no hay coincidencia y la aplicación no procesará nada.Finalmente, las rutas se
redirectTocomportan de manera ligeramente diferente a las rutas regulares, y me parece que serían el único lugar donde alguien realmente querría usarpathMatch: full. Pero llegaremos a esto más tarde.Coincidencia de
prefixruta predeterminada ( )El razonamiento detrás del nombre
prefixes que dicha configuración de ruta verificará si el configuradopathes un prefijo de los segmentos de URL restantes. Sin embargo, el enrutador solo puede hacer coincidir segmentos completos , lo que hace que este nombre sea un poco confuso.De todos modos, digamos que esta es nuestra configuración de enrutador de nivel raíz:
Tenga en cuenta que todos los
Routeobjetos aquí utilizan la estrategia de coincidencia predeterminada, que esprefix. Esta estrategia significa que el enrutador itera sobre todo el árbol de configuración e intenta compararlo con la URL objetivo segmento por segmento hasta que la URL coincida completamente . Así es como se haría para este ejemplo:users.'products' !== 'users', así que omita esa rama. Tenga en cuenta que estamos usando una verificación de igualdad en lugar de un.startsWith()o.includes(): ¡solo cuentan las coincidencias de segmento completo!:othercoincide con cualquier valor, por lo que es una coincidencia. Sin embargo, la URL de destino aún no coincide por completo (todavía necesitamos hacer coincidirjamesyarticles), por lo que el enrutador busca niños.:otherestricks, que es!== 'james', por lo tanto, no es un partido.'user' !== 'users, saltar rama.'users' === 'users- el segmento coincide. Sin embargo, todavía no es una coincidencia completa, por lo que debemos buscar niños (igual que en el paso 3).'permissions' !== 'james', Saltarlo.:userIDcoincide con cualquier cosa, por lo que tenemos una coincidencia para eljamessegmento. Sin embargo, esto todavía no es una coincidencia completa, por lo que debemos buscar un niño que coincidaarticles.:userIDtiene una ruta secundariaarticles, ¡lo que nos da una coincidencia completa! Por lo tanto, la aplicación se procesaUserArticlesComponent.Coincidencia de URL completa (
full)Ejemplo 1
Imagínese ahora que el
usersobjeto de configuración de ruta se ve así:Tenga en cuenta el uso de
pathMatch: full. Si este fuera el caso, los pasos 1-5 serían los mismos, sin embargo, el paso 6 sería diferente:'users' !== 'users/james/articles- el segmento no coincide porque la configuración de la rutausersconpathMatch: fullno coincide con la URL completa, que esusers/james/articles.Ejemplo 2
¿Y si tuviéramos esto en su lugar?
users/:userIDpathMatch: fullsolo con coincidencias, porusers/jameslo que es una no coincidencia una vez más, y la aplicación no muestra nada.Ejemplo 3
Consideremos esto:
En este caso:
'users' === 'users- el segmento coincide, perojames/articlessigue siendo inigualable. Busquemos niños.'permissions' !== 'james'- saltar.:userID'solo puede coincidir con un solo segmento, que seríajames. Sin embargo, es unapathMatch: fullruta y debe coincidirjames/articles(toda la URL restante). ¡No es capaz de hacer eso y, por lo tanto, no es una coincidencia (por lo que omitimos esta rama)!Como habrás notado, una
pathMatch: fullconfiguración básicamente dice esto:Redireccionamientos
Cualquiera
Routeque haya definido unredirectTose comparará con la URL de destino de acuerdo con los mismos principios. La única diferencia aquí es que el redireccionamiento se aplica tan pronto como coincide un segmento . Esto significa que si una ruta de redireccionamiento utiliza laprefixestrategia predeterminada , una coincidencia parcial es suficiente para provocar un redireccionamiento . He aquí un buen ejemplo:Para nuestra URL inicial (
/users/james/articles), esto es lo que sucedería:'not-found' !== 'users'- Saltarlo.'users' === 'users'- tenemos un partido.redirectTo: 'not-found', que se aplica inmediatamente .not-found.not-foundinmediato. La aplicación se procesaNotFoundComponent.Ahora considere lo que sucedería si la
usersruta también tuvierapathMatch: full:'not-found' !== 'users'- Saltarlo.userscoincidiría con el primer segmento de la URL, pero la configuración de la ruta requiere unafullcoincidencia, por lo tanto, omítala.'users/:userID'partidosusers/james.articlestodavía no coincide pero esta ruta tiene hijos.articlesen los niños. La URL completa ahora coincide y la aplicación se procesaUserArticlesComponent.Ruta vacía (
path: '')La ruta vacía es un caso un poco especial porque puede coincidir con cualquier segmento sin "consumirlo" (por lo que sus hijos tendrían que coincidir con ese segmento nuevamente). Considere este ejemplo:
Digamos que estamos intentando acceder a
/users:path: ''siempre coincidirá, por lo que la ruta coincide. Sin embargo, toda la URL no ha coincidido, ¡todavía tenemos que hacerlousers!users, que coincide con el segmento restante (¡y único!) Y tenemos una coincidencia completa. La aplicación se procesaBadUsersComponent.Ahora volvamos a la pregunta original
El OP utilizó esta configuración de enrutador:
Si estamos navegando a la URL raíz (
/), así es como el enrutador resolvería eso:welcomeno coincide con un segmento vacío, así que omítalo.path: ''coincide con el segmento vacío. Tiene unpathMatch: 'full', que también está satisfecho porque hemos hecho coincidir toda la URL (tenía un solo segmento vacío).welcomeproduce una redirección y la aplicación se procesaWelcomeComponent.¿Y si no hubiera
pathMatch: 'full'?En realidad, uno esperaría que todo se comportara exactamente igual. Sin embargo, Angular previene explícitamente tal configuración (
{ path: '', redirectTo: 'welcome' }) porque si pones estoRoutearribawelcome, teóricamente crearía un bucle sin fin de redirecciones. Entonces, Angular simplemente arroja un error , ¡por lo que la aplicación no funcionaría en absoluto! ( https://angular.io/api/router/Route#pathMatch )Esto realmente no tiene mucho sentido porque Angular ha implementado una protección contra redireccionamientos infinitos: solo ejecuta un único redireccionamiento por nivel de enrutamiento.
¿Qué hay de
path: '**'?path: '**'coincidirá absolutamente con cualquier cosa (af/frewf/321532152/fsaes una coincidencia) con o sin unpathMatch: 'full', por lo que no tiene sentido usar esta opción de configuración.Además, dado que coincide con todo, también se incluye la ruta raíz, lo que hace que sea
{ path: '', redirectTo: 'welcome' }redundante en esta configuración.Curiosamente, está perfectamente bien tener esta configuración:
Si navegamos hacia
/welcome,path: '**'habrá una coincidencia y se producirá un redireccionamiento a la bienvenida. Esto debería iniciar un ciclo interminable de redireccionamientos, pero Angular lo detiene inmediatamente y todo funciona bien.fuente
La estrategia de búsqueda de rutas, una de "prefijo" o "completa". El valor predeterminado es 'prefijo'.
De forma predeterminada, el enrutador verifica los elementos de la URL desde la izquierda para ver si la URL coincide con una ruta determinada y se detiene cuando hay una coincidencia. Por ejemplo, '/ team / 11 / user' coincide con 'team /: id'.
La estrategia de coincidencia de ruta "completa" coincide con la URL completa. Es importante hacer esto al redirigir rutas de ruta vacía. De lo contrario, debido a que una ruta vacía es un prefijo de cualquier URL, el enrutador aplicaría la redirección incluso cuando navega hacia el destino de la redirección, creando un bucle sin fin.
Fuente: https://angular.io/api/router/Route#properties
fuente