Estou criando um site de imobiliária usando Angular 2, Google Maps, etc. e quando um usuário muda o centro do mapa, eu faço uma pesquisa na API indicando a posição atual do mapa, bem como o raio. O fato é que desejo refletir esses valores no url sem recarregar a página inteira. Isso é possível? Eu encontrei algumas soluções usando o AngularJS 1.x, mas nada sobre o Angular 2.
javascript
angular
routes
angular2-routing
Marcos Basualdo
fonte
fonte
Respostas:
Você poderia usar o
location.go(url)
que basicamente mudaria seu url, sem alterar a rota de aplicação.A questão relacionada que descreve
location.go
não sugereRouter
que ocorram mudanças.fonte
import { Location } from '@angular/common';
em Angular 4constructor(private location: Location){ }
location.go()
enquanto deveriathis.location.go()
. Ao emitir othis.
, você chama a interface de localização do Typescript.A partir do RC6, você pode fazer o seguinte para alterar o URL sem alterar o estado e, assim, manter seu histórico de rota
fonte
Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'some/newstate'
Usar
location.go(url)
é o caminho a seguir, mas em vez de codificar o url, considere gerá-lo usandorouter.createUrlTree()
.Visto que você deseja fazer a seguinte chamada de roteador:
this.router.navigate([{param: 1}], {relativeTo: this.activatedRoute})
mas sem recarregar o componente, ele pode ser reescrito como:fonte
this.router.createUrlTree([], {relativeTo: this.activatedRoute, queryParams: {param: 1}}).toString()
Para qualquer pessoa como eu, encontrar esta questão pode ser útil.
Tive um problema semelhante e tentei inicialmente usar location.go e location.replaceState conforme sugerido em outras respostas aqui. No entanto, tive problemas quando tive que navegar para outra página no aplicativo porque a navegação era relativa à rota atual e a rota atual não estava sendo atualizada por location.go ou location.replaceState (o roteador não sabe de nada sobre o que eles fazem ao URL)
Em essência, eu precisava de uma solução que NÃO recarregasse a página / componente quando o parâmetro da rota mudasse, mas atualizasse o estado da rota internamente.
Acabei usando parâmetros de consulta. Você pode encontrar mais sobre isso aqui: https://angular-2-training-book.rangle.io/handout/routing/query_params.html
Portanto, se você precisar fazer algo como salvar um pedido e obter um ID do pedido, pode atualizar o URL da página conforme mostrado abaixo. Atualizar um local central e dados relacionados em um mapa seria semelhante
e você acompanha isso dentro do método ngOnInit como:
Se precisar ir direto para a página do pedido com um novo pedido (não salvo), você pode:
Ou, se precisar ir direto para a página de pedido de um pedido existente (salvo), você pode fazer:
fonte
Tive grandes problemas para fazer isso funcionar nas versões RCx do angular2. O pacote Location foi movido e a execução de location.go () dentro de constructor () não funcionará. Ele precisa ser ngOnInit () ou posterior no ciclo de vida. Aqui está um exemplo de código:
Aqui estão os recursos angulares sobre o assunto: https://angular.io/docs/ts/latest/api/common/index/Location-class.html https://angular.io/docs/ts/latest/api/ common / index / LocationStrategy-class.html
fonte
Eu uso esta maneira de obtê-lo:
- EDITAR -
Acho que devo acrescentar mais algumas informações para isso.
Se você usa o
this.location.replaceState()
roteador do seu aplicativo não está atualizado, então se você usar as informações do roteador posteriormente não é igual para isso no seu navegador. Por exemplo, se você usarlocalizeService
para alterar o idioma, depois de alterar o idioma, seu aplicativo de volta para a última URL onde você estava antes, altere-o comthis.location.replaceState()
.Se você não quiser esse comportamento, pode escolher um método diferente para atualizar o URL, como:
Nesta opção, seu navegador também não atualiza, mas sua
URL
alteração também é injetada emRouter
seu aplicativo, portanto, quando você muda de idioma, não tem problemas como emthis.location.replaceState()
.Claro, você pode escolher o método de acordo com suas necessidades. O primeiro é mais leve porque você não envolve mais seu aplicativo do que muda o
URL
navegador.fonte
Para mim, foi na verdade uma mistura de ambos com o Angular 4.4.5.
O uso de router.navigate destruía meu url por não respeitar a parte realtiveTo: enabledRoute.
Acabei com:
fonte
Use o atributo queryParamsHandling: 'merge' ao alterar o url.
fonte