Em um dos modelos de minhas rotas Angular 2 ( FirstComponent ), tenho um botão
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
Meu objetivo é alcançar:
Clique no botão -> rotear para outro componente enquanto preserva os dados e sem usar o outro componente como diretiva.
Isto é o que eu tentei ...
1ª ABORDAGEM
Na mesma visão, estou armazenando a coleta dos mesmos dados com base na interação do usuário.
first.component.ts
export class FirstComponent {
constructor(private _router: Router) { }
property1: number;
property2: string;
property3: TypeXY; // this a class, not a primitive type
// here some class methods set the properties above
// DOM events
routeWithData(){
// here route
}
}
Normalmente, eu direcionaria para o SecondComponent por
this._router.navigate(['SecondComponent']);
eventualmente passando os dados por
this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);
Considerando que a definição da ligação com os parâmetros seria
@RouteConfig([
// ...
{ path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent}
)]
O problema dessa abordagem é que acho que não posso transmitir dados complexos (por exemplo, um objeto como property3) dentro do URL;
2ª ABORDAGEM
Uma alternativa seria incluir o SecondComponent como diretiva no FirstComponent.
<SecondComponent [p3]="property3"></SecondComponent>
No entanto, eu quero rotear para esse componente, não incluí-lo!
3ª ABORDAGEM
A solução mais viável que vejo aqui seria usar um Serviço (por exemplo, FirstComponentService) para
- armazene os dados (_firstComponentService.storeData ()) em routeWithData () em FirstComponent
- recuperar os dados (_firstComponentService.retrieveData ()) em ngOnInit () em SecondComponent
Embora essa abordagem pareça perfeitamente viável, pergunto-me se essa é a maneira mais fácil / elegante de atingir a meta.
Em geral, eu gostaria de saber se estou perdendo outras abordagens em potencial para passar os dados entre componentes, principalmente com a menor quantidade possível de código
fonte
Pass data using Query Parameters
é o que eu estava procurando. seu link salvou meu dia.state
cheque PR para mais detalhes. Algumas informações úteis aquiRespostas:
atualização 4.0.0
Consulte Documentos angulares para obter mais detalhes https://angular.io/guide/router#fetch-data-before-navigating
original
Usar um serviço é o caminho a percorrer. Nos parâmetros de rota, você só deve passar os dados que deseja que sejam refletidos na barra de URL do navegador.
Consulte também https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
O roteador enviado com o RC.4 reintroduz
data
Consulte também o Plunker em https://github.com/angular/angular/issues/9757#issuecomment-229847781
fonte
ngOnInit() { this.myVar = this.route.snapshot.data['some_data']; }
NavigationExtras
- stackoverflow.com/a/54879389/1148107Acho que já que não temos o tipo de coisa $ rootScope no angular 2 como no angular 1.x. Podemos usar o serviço / classe angular 2 compartilhada enquanto estiver no ngOnDestroy, passar dados para o serviço e, após o roteamento, extrair os dados do serviço na função ngOnInit :
Aqui estou usando o DataService para compartilhar o objeto herói:
Passe o objeto do componente da primeira página:
Pegue o objeto do componente da segunda página:
Aqui está um exemplo: plunker
fonte
this.hero = this.dataService.hero
? Vou receber os valores?bem, a maneira mais fácil de fazer isso em versões angulares 6 ou outras, espero é simplesmente definir seu caminho com a quantidade de dados que você deseja passar
Como você pode ver na minha definição de rotas, eu adicionei o
/:id
suporte aos dados que eu quero passar para o componente através da navegação do roteador. Portanto, seu código será parecido compara ler
id
o componente, importeActivatedRoute
comoe no
ngOnInit
é onde você recupera os dadosvocê pode ler mais neste artigo https://www.tektutorialshub.com/angular-passing-parameters-to-route/
fonte
O Angular 7.2.0 introduziu uma nova maneira de transmitir os dados ao navegar entre componentes roteados:
Ou:
Para ler o estado, você pode acessar a
window.history.state
propriedade depois que a navegação terminar:fonte
window.history.state
retorna algo como, em{navigationId: 2}
vez de retornar o objeto que eu passei.navigationId
com um valor adicionado. Se nenhum dado for adicionado, apenas onavigationId
será mostrado. Veja os dados passados, volte ou atualize seu aplicativo e reative a ação que adiciona os dados à rota e navega para a próxima rota (por exemplo, clique no botão). Isso adicionará seus dados ao objeto.Alguma pessoa super inteligente (tmburnell) que não sou eu sugere reescrever os dados da rota:
Como visto aqui nos comentários.
Espero que alguém ache isso útil
fonte
Eu esta a outra abordagem não é boa para esta questão. Eu acho que a melhor abordagem é Query-Parameter por
Router
angular que tem 2 vias:Com este código você pode navegar para
url
porparams
em seu código html:Você deve injetar o roteador dentro do seu
constructor
gosto:Agora use isso como:
Agora, se você quiser ler
Router
em outro,Component
você deve usar o seguinteActivatedRoute
:e
subscribe
que:fonte
É 2019 e muitas das respostas aqui funcionariam, dependendo do que você deseja fazer. Se você deseja passar em algum estado interno não visível na URL (parâmetros, consulta), você pode usar
state
desde o 7.2 (como eu aprendi hoje :)).No blog (créditos Tomasz Kula) - você navega para rotear ....
... de ts:
this.router.navigateByUrl('/details', { state: { hello: 'world' } });
... do modelo HTML:
<a routerLink="/details" [state]="{ hello: 'world' }">Go</a>
E para buscá-lo no componente de destino:
Tarde, mas espero que isso ajude alguém com Angular recente.
fonte
Solução com o ActiveRoute (se você deseja passar o objeto por rota - use JSON.stringfy / JSON.parse):
Prepare o objeto antes de enviar:
Receba seu objeto no componente de destino:
fonte
super.ngOnInit();
?A terceira abordagem é a maneira mais comum de compartilhar dados entre componentes. você pode injetar o serviço de item que deseja usar no componente relacionado.
fonte
Passe usando JSON
fonte
use um serviço compartilhado para armazenar dados com um índice personalizado. em seguida, envie esse índice personalizado com queryParam. essa abordagem é mais flexível .
.
fonte
diga que você tem
e você deseja passar dados para component2.ts .
em component1.ts é uma variável com dados digamos
fonte
Você pode usar o BehaviorSubject para compartilhar dados entre componentes roteados. Um BehaviorSubject mantém um valor. Quando está inscrito, emite o valor imediatamente. Um Assunto não possui um valor.
No serviço.
No componente, você pode se inscrever neste BehaviorSubject.
Nota: O assunto não funcionará aqui. É necessário usar apenas o Assunto do comportamento.
fonte