Aqui é usado o pathmatch como completo e quando eu excluo este pathmatch ele nem carrega o aplicativo ou executa o projeto
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
fonte
fonte
Ref: https://angular.io/guide/router#set-up-redirects
pathMatch: 'full'
significa que todo o caminho da URL precisa corresponder e é consumido pelo algoritmo de correspondência de rota.pathMatch: 'prefix'
significa que a primeira rota em que o caminho corresponde ao início da URL é escolhida, mas o algoritmo de correspondência de rota continua pesquisando as rotas secundárias em que o restante da URL corresponde.fonte
Embora tecnicamente corretas, as outras respostas se beneficiariam de uma explicação da correspondência de URL para rota do Angular. Acho que você não consegue entender totalmente (com o perdão do trocadilho) o que
pathMatch: full
significa se você não sabe como o roteador funciona.Vamos primeiro definir algumas coisas básicas. Usaremos este URL como um exemplo:
/users/james/articles?from=134#section
.Pode ser óbvio, mas primeiro vamos apontar que os parâmetros de consulta (
?from=134
) e fragmentos (#section
) não desempenham nenhum papel na correspondência de caminho . Apenas o url base (/users/james/articles
) é importante.Angular divide URLs em segmentos . Os segmentos de
/users/james/articles
são, é clarousers
,james
earticles
.A configuração do roteador é uma estrutura em árvore com um único nó raiz. Cada
Route
objeto é um nó, que pode terchildren
nós, que por sua vez podem ter outroschildren
nós ou ser nós folha.O objetivo do roteador é encontrar uma ramificação de configuração do roteador , começando no nó raiz, que corresponderia exatamente a todos (!!!) segmentos da URL. Isso é crucial! Se o Angular não encontrar uma ramificação de configuração de rota que possa corresponder a todo o URL - nem mais nem menos - ele não renderizará nada .
Por exemplo, se o seu URL de destino for,
/a/b/c
mas o roteador só é capaz de corresponder a/a/b
ou/a/b/c/d
, então não há correspondência e o aplicativo não renderizará nada.Finalmente, as rotas com
redirectTo
se comportam de maneira um pouco diferente das rotas normais e parece-me que seriam o único lugar onde alguém realmente gostaria de usarpathMatch: full
. Mas veremos isso mais tarde.prefix
Correspondência de caminho padrão ( )O raciocínio por trás do nome
prefix
é que essa configuração de rota verificará se o configuradopath
é um prefixo dos segmentos de URL restantes. No entanto, o roteador só pode corresponder a segmentos completos , o que torna essa nomenclatura um pouco confusa.De qualquer forma, digamos que esta é a nossa configuração de roteador de nível raiz:
Observe que cada
Route
objeto aqui usa a estratégia de correspondência padrão, que éprefix
. Essa estratégia significa que o roteador itera em toda a árvore de configuração e tenta combiná-la com o URL de destino, segmento por segmento, até que o URL seja totalmente compatível . Veja como isso seria feito para este exemplo:users
.'products' !== 'users'
, então pule esse ramo. Observe que estamos usando uma verificação de igualdade em vez de um.startsWith()
or.includes()
- apenas o segmento completo corresponde à contagem!:other
corresponde a qualquer valor, portanto, é uma correspondência. No entanto, a URL de destino ainda não foi totalmente correspondida (ainda precisamos corresponder ajames
earticles
), portanto, o roteador procura filhos.:other
étricks
, o que!== 'james'
, portanto, não é compatível.'user' !== 'users
, pular ramo.'users' === 'users
- o segmento corresponde. No entanto, ainda não é uma correspondência completa, portanto, precisamos procurar os filhos (o mesmo que na etapa 3).'permissions' !== 'james'
, pule isso.:userID
corresponde a qualquer coisa, portanto, temos uma correspondência para ojames
segmento. No entanto, ainda não é uma correspondência completa, portanto, precisamos procurar uma criança que correspondaarticles
.:userID
tem uma rota infantilarticles
, o que nos dá uma correspondência completa! Assim, o aplicativo é renderizadoUserArticlesComponent
.full
Correspondência de URL completo ( )Exemplo 1
Imagine agora que o
users
objeto de configuração de rota se parecia com isto:Observe o uso de
pathMatch: full
. Se fosse esse o caso, as etapas 1 a 5 seriam iguais, mas a etapa 6 seria diferente:'users' !== 'users/james/articles
- o segmento não corresponde porque a configuração do caminhousers
compathMatch: full
não corresponde ao URL completo, que éusers/james/articles
.Exemplo 2
E se em vez disso tivéssemos:
users/:userID
compathMatch: full
jogos apenasusers/james
portanto, é uma não correspondência mais uma vez e o aplicativo não renderiza nada.Exemplo 3
Vamos considerar isso:
Nesse caso:
'users' === 'users
- o segmento corresponde, masjames/articles
ainda permanece incomparável. Vamos procurar crianças.'permissions' !== 'james'
- pule.:userID'
só pode corresponder a um único segmento, o que seriajames
. No entanto, é umapathMatch: full
rota e deve corresponderjames/articles
(todo o URL restante). Não é capaz de fazer isso e, portanto, não é uma correspondência (por isso pulamos este ramo)!Como você deve ter notado, uma
pathMatch: full
configuração basicamente diz o seguinte:Redireciona
Qualquer um
Route
que tenha definido umredirectTo
será comparado ao URL de destino de acordo com os mesmos princípios. A única diferença aqui é que o redirecionamento é aplicado assim que um segmento corresponde . Isso significa que, se uma rota de redirecionamento estiver usando aprefix
estratégia padrão , uma correspondência parcial é suficiente para causar um redirecionamento . Aqui está um bom exemplo:Para nosso URL inicial (
/users/james/articles
), eis o que aconteceria:'not-found' !== 'users'
- pule isso.'users' === 'users'
- nós temos um fósforo.redirectTo: 'not-found'
, que é aplicado imediatamente .not-found
.not-found
imediatamente. O aplicativo é renderizadoNotFoundComponent
.Agora, considere o que aconteceria se a
users
rota também tivessepathMatch: full
:'not-found' !== 'users'
- pule isso.users
corresponderia ao primeiro segmento do URL, mas a configuração da rota requer umfull
correspondência, portanto, ignore-a.'users/:userID'
jogosusers/james
.articles
ainda não foi correspondido, mas este trajeto tem filhos.articles
nas crianças. A URL inteira agora é correspondida e o aplicativo é renderizadoUserArticlesComponent
.Caminho vazio (
path: ''
)O caminho vazio é um caso especial porque pode corresponder a qualquer segmento sem "consumi-lo" (portanto, seus filhos teriam que corresponder a esse segmento novamente). Considere este exemplo:
Digamos que estejamos tentando acessar
/users
:path: ''
sempre corresponderá, portanto, a rota corresponde. No entanto, todo o URL não foi correspondido - ainda precisamos fazer a correspondênciausers
!users
, que corresponde ao segmento restante (e único!) E temos uma correspondência completa. O aplicativo é renderizadoBadUsersComponent
.Agora, de volta à pergunta original
O OP usou esta configuração de roteador:
Se estivermos navegando para o URL raiz (
/
), veja como o roteador resolveria isso:welcome
não corresponde a um segmento vazio, portanto, ignore-o.path: ''
corresponde ao segmento vazio. Tem umpathMatch: 'full'
, que também é satisfeito, pois combinamos o URL inteiro (ele tinha um único segmento vazio).welcome
acontece e o aplicativo é renderizadoWelcomeComponent
.E se não houvesse
pathMatch: 'full'
?Na verdade, seria de se esperar que a coisa toda se comportasse exatamente da mesma forma. No entanto, o Angular impede explicitamente essa configuração (
{ path: '', redirectTo: 'welcome' }
) porque, se você colocar issoRoute
acimawelcome
, teoricamente criaria um loop infinito de redirecionamentos. Portanto, o Angular apenas gera um erro , e é por isso que o aplicativo não funcionava! ( https://angular.io/api/router/Route#pathMatch )Isso realmente não faz muito sentido porque o Angular implementou uma proteção contra redirecionamentos infinitos - ele executa apenas um único redirecionamento por nível de roteamento.
Sobre o quê
path: '**'
?path: '**'
irá corresponder a absolutamente qualquer coisa (af/frewf/321532152/fsa
é uma correspondência) com ou sem umpathMatch: 'full'
, portanto, não há nenhum ponto em usar esta opção de configuração.Além disso, como corresponde a tudo, o caminho raiz também está incluído, o que torna
{ path: '', redirectTo: 'welcome' }
redundante nesta configuração.Curiosamente, é perfeitamente normal ter esta configuração:
Se navegarmos para
/welcome
,path: '**'
haverá uma correspondência e um redirecionamento para boas-vindas acontecerá. Isso deve iniciar um loop infinito de redirecionamentos, mas o Angular interrompe isso imediatamente e tudo funciona bem.fonte
A estratégia de correspondência de caminho, um de 'prefixo' ou 'completo'. O padrão é 'prefixo'.
Por padrão, o roteador verifica os elementos da URL à esquerda para ver se a URL corresponde a um determinado caminho e para quando há uma correspondência. Por exemplo, '/ equipe / 11 / usuário' corresponde a 'equipe /: id'.
A estratégia de correspondência de caminho 'full' corresponde a todo o URL. É importante fazer isso ao redirecionar rotas de caminho vazio. Caso contrário, como um caminho vazio é um prefixo de qualquer URL, o roteador aplicaria o redirecionamento mesmo ao navegar para o destino do redirecionamento, criando um loop infinito.
Fonte: https://angular.io/api/router/Route#properties
fonte