É possível ter um parâmetro de rota opcional na rota Angular 2? Eu tentei a sintaxe Angular 1.x no RouteConfig, mas recebi o erro abaixo:
"EXCEÇÃO ORIGINAL: Caminho" / user /: id? "Contém"? ", O que não é permitido em uma configuração de rota."
@RouteConfig([
{
path: '/user/:id?',
component: User,
as: 'User'
}])
javascript
angular
Jeroen
fonte
fonte
RouteParams
não importar para o componente, verifique isso: stackoverflow.com/a/36792261/806202 . A solução é usarActivatedRoute
:route.snapshot.params['routeParam']
Dessa forma, o componente não é renderizado novamente quando o parâmetro é adicionado.
fonte
pathMatch: 'full'
para redirecionamento, caso contrário, caminhos, comousers/admin
também é redirecionada no meu caso/users/all
ou/users/home
leia 'all' ou 'home' como oid
e simplesmente ignore-o se corresponder ao seu valor mágico. Então a primeira linha acima se tornaredirectTo: 'users/home'
ou o que você decidir. Para mim, uma barra à direita realmente se destaca como algo errado.É recomendável usar um parâmetro de consulta quando as informações são opcionais.
de https://angular.io/guide/router#optional-route-parameters
Você só precisa retirar o parâmetro do caminho da rota.
fonte
Angular 4 - Solução para atender à solicitação do parâmetro opcional:
FAÇA ISSO:
Observe que as rotas
products
eproducts/:id
são nomeadas exatamente da mesma forma. O Angular 4 seguirá corretamenteproducts
para rotas sem parâmetro e, se um parâmetro seguirproducts/:id
.No entanto, o caminho para a rota sem parâmetro não
products
deve ter uma barra final; caso contrário, o angular o tratará incorretamente como um caminho de parâmetro. Então, no meu caso, eu tinha a barra final de produtos e não estava funcionando.NÃO FAÇA ISTO:
fonte
data
para o componente, que pode ser diferente para cada rota, mesmo para o mesmo componente. Exemplo{path: 'products', component: ProductsComponent, data: { showAllProducts: true} },
poderia ser usado e, em seguida, você verificarshowAllProducts
. Um pouco melhor, em seguida, procurar um nulo, mas para casos mais simples, provavelmente é bom.A resposta de rerezz é muito boa, mas tem uma falha séria. Faz com que o
User
componente execute novamente ongOnInit
método.Pode ser problemático quando você faz coisas pesadas lá e não deseja que seja reexecutado quando você alterna da rota não paramétrica para a paramétrica. Embora essas duas rotas tenham como objetivo imitar um parâmetro de URL opcional, não se tornem duas rotas separadas.
Aqui está o que eu sugiro para resolver o problema:
Em seguida, você pode mover a lógica responsável por manipular o parâmetro para o
UserWithParam
componente e deixar a lógica base noUser
componente. O que você fizerUser::ngOnInit
não será executado novamente quando você navegar de / user para / user / 123 .Não esqueça de colocar o
<router-outlet></router-outlet>
noUser
modelo.fonte
As respostas sugeridas aqui, incluindo a resposta aceita do rerezz que sugere a adição de várias entradas de rota, funcionam bem.
No entanto, o componente será recriado ao mudar entre as entradas da rota, ou seja, entre a entrada da rota com o parâmetro e a entrada sem o parâmetro.
Se você quiser evitar isso, pode criar seu próprio correspondente de rotas que corresponderá às duas rotas:
Em seguida, use o matcher na sua configuração de rota:
fonte
Com angular4, só precisamos organizar rotas juntas na hierarquia
Isso funciona para mim. Dessa forma, o roteador sabe qual é a próxima rota com base nos parâmetros de identificação da opção.
fonte
Deparou-se com outra instância desse problema e, ao procurar uma solução para ele, veio aqui. Meu problema era que eu fazia as crianças e carregava preguiçosamente os componentes para otimizar um pouco as coisas. Em resumo, se você estiver com preguiça de carregar o módulo pai. O principal foi o uso de '/: id' na rota e as queixas de '/' fazer parte dela. Não é o problema exato aqui, mas se aplica.
Roteamento de aplicativo do pai
Rotas filho carregadas preguiçosamente
fonte
Não posso comentar, mas em referência a: Parâmetro de rota opcional do Angular 2
uma atualização para o Angular 6:
Consulte https://angular.io/api/router/ActivatedRoute para obter informações adicionais sobre o roteamento Angular6.
fonte
Enfrentando um problema semelhante com carregamento lento, eu fiz isso:
E então no componente:
Deste jeito:
A rota sem
/
é redirecionada para a rota com. Por causa dissopathMatch: 'full'
, apenas essa rota completa específica é redirecionada.Então,
users/:id
é recebido. Se a rota real erausers/
,id
é""
, faça o check-inngOnInit
e aja de acordo; caso contrário,id
é o id e prossiga.O restante do componente atua
selectedUser
é indefinido (* ngIf e coisas assim).fonte