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: full
hace 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/articles
importa la URL base ( ).Angular divide las URL en segmentos . Los segmentos de
/users/james/articles
son, por supuestousers
,james
yarticles
.La configuración del enrutador es una estructura de árbol con un solo nodo raíz. Cada
Route
objeto es un nodo, que puede tenerchildren
nodos, que a su vez pueden tener otroschildren
o 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/c
pero el enrutador solo puede coincidir con/a/b
o/a/b/c/d
, entonces no hay coincidencia y la aplicación no procesará nada.Finalmente, las rutas se
redirectTo
comportan 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
prefix
ruta predeterminada ( )El razonamiento detrás del nombre
prefix
es que dicha configuración de ruta verificará si el configuradopath
es 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
Route
objetos 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!:other
coincide 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 coincidirjames
yarticles
), por lo que el enrutador busca niños.:other
estricks
, 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.:userID
coincide con cualquier cosa, por lo que tenemos una coincidencia para eljames
segmento. Sin embargo, esto todavía no es una coincidencia completa, por lo que debemos buscar un niño que coincidaarticles
.:userID
tiene 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
users
objeto 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 rutausers
conpathMatch: full
no coincide con la URL completa, que esusers/james/articles
.Ejemplo 2
¿Y si tuviéramos esto en su lugar?
users/:userID
pathMatch: full
solo con coincidencias, porusers/james
lo 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/articles
sigue siendo inigualable. Busquemos niños.'permissions' !== 'james'
- saltar.:userID'
solo puede coincidir con un solo segmento, que seríajames
. Sin embargo, es unapathMatch: full
ruta 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: full
configuración básicamente dice esto:Redireccionamientos
Cualquiera
Route
que haya definido unredirectTo
se 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 laprefix
estrategia 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-found
inmediato. La aplicación se procesaNotFoundComponent
.Ahora considere lo que sucedería si la
users
ruta también tuvierapathMatch: full
:'not-found' !== 'users'
- Saltarlo.users
coincidiría con el primer segmento de la URL, pero la configuración de la ruta requiere unafull
coincidencia, por lo tanto, omítala.'users/:userID'
partidosusers/james
.articles
todavía no coincide pero esta ruta tiene hijos.articles
en 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:welcome
no 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).welcome
produce 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 estoRoute
arribawelcome
, 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/fsa
es 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