En una de las plantillas de mis rutas de Angular 2 ( FirstComponent ) tengo un botón
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
Mi objetivo es lograr:
Haga clic en el botón -> diríjase a otro componente mientras conserva los datos y sin usar el otro componente como directiva.
Esto es lo que probé ...
1er ENFOQUE
En la misma vista, estoy almacenando la recopilación de los mismos datos en función de la interacción del usuario.
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 me dirigiría a SecondComponent por
this._router.navigate(['SecondComponent']);
eventualmente pasando los datos por
this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);
mientras que la definición del enlace con parámetros sería
@RouteConfig([
// ...
{ path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent}
)]
El problema con este enfoque es que supongo que no puedo pasar datos complejos (por ejemplo, un objeto como propiedad3) en la URL;
2º ENFOQUE
Una alternativa sería incluir SecondComponent como directiva en FirstComponent.
<SecondComponent [p3]="property3"></SecondComponent>
Sin embargo, quiero enrutar a ese componente, ¡no incluirlo!
3er ENFOQUE
La solución más viable que veo aquí sería usar un Servicio (por ejemplo, FirstComponentService) para
- almacenar los datos (_firstComponentService.storeData ()) en routeWithData () en FirstComponent
- recuperar los datos (_firstComponentService.retrieveData ()) en ngOnInit () en SecondComponent
Si bien este enfoque parece perfectamente viable, me pregunto si esta es la forma más fácil / elegante de lograr el objetivo.
En general, me gustaría saber si me faltan otros enfoques potenciales para pasar los datos entre componentes, particularmente con la menor cantidad posible de código
fuente
Pass data using Query Parameters
es lo que estaba buscando Tu enlace me salvó el día.state
el PR para obtener más detalles. Alguna información útil aquíRespuestas:
actualización 4.0.0
Ver documentos angulares para más detalles https://angular.io/guide/router#fetch-data-before-navigating
original
Usar un servicio es el camino a seguir. En los parámetros de ruta, solo debe pasar los datos que desea que se reflejen en la barra de URL del navegador.
Ver también https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
El enrutador enviado con RC.4 reintroduce
data
Vea también el Plunker en https://github.com/angular/angular/issues/9757#issuecomment-229847781
fuente
ngOnInit() { this.myVar = this.route.snapshot.data['some_data']; }
NavigationExtras
- stackoverflow.com/a/54879389/1148107Creo que dado que no tenemos el tipo de cosa $ rootScope en angular 2 como en angular 1.x. Podemos usar el servicio / clase angular 2 mientras que en ngOnDestroy pase los datos al servicio y, después del enrutamiento, tomemos los datos del servicio en la función ngOnInit :
Aquí estoy usando DataService para compartir el objeto héroe:
Pase el objeto del primer componente de la página:
Tomar objeto del componente de la segunda página:
Aquí hay un ejemplo: plunker
fuente
this.hero = this.dataService.hero
? ¿Obtendré los valores?bueno, la forma más fácil de hacerlo en angular 6 u otras versiones, espero es simplemente definir su ruta con la cantidad de datos que desea pasar
Como puede ver en la definición de mis rutas, he agregado el
/:id
soporte para los datos que quiero pasar al componente a través de la navegación del enrutador. Por lo tanto, su código se verá asípara leer
id
el componente, solo importaActivatedRoute
comoy en el
ngOnInit
es donde recuperas los datosPuedes leer más en este artículo https://www.tektutorialshub.com/angular-passing-parameters-to-route/
fuente
Angular 7.2.0 introdujo una nueva forma de pasar los datos al navegar entre componentes enrutados:
O:
Para leer el estado, puede acceder a la
window.history.state
propiedad una vez que haya finalizado la navegación:fuente
window.history.state
devuelve algo como en{navigationId: 2}
lugar de devolver el objeto que pasé.navigationId
con un valor agregado. Si no se agregan datos, solonavigationId
se mostrará el. Observe los datos pasados, regrese o actualice su aplicación y vuelva a activar la acción que agrega los datos a la ruta y navega a la siguiente ruta (por ejemplo, hacer clic en el botón). Esto agregará sus datos al objeto.Una persona súper inteligente (tmburnell) que no soy yo sugiere reescribir los datos de la ruta:
Como se ve aquí en los comentarios.
Espero que alguien encuentre esto útil
fuente
Este otro enfoque no es bueno para este problema. Creo que el mejor enfoque es Query-Parameter by
Router
angular que tiene 2 vías:Con este código puede navegar
url
porparams
en su código html:Debe inyectar el enrutador dentro de su
constructor
gusto:Ahora use eso como:
Ahora, si desea leer
Router
en otroComponent
, debe usarActivatedRoute
como:y
subscribe
que:fuente
Es 2019 y muchas de las respuestas aquí funcionarían, dependiendo de lo que quieras hacer. Si desea pasar en algún estado interno no visible en la URL (parámetros, consulta) puede usar
state
desde 7.2 (como he aprendido hoy :)).Desde el blog (créditos Tomasz Kula): navegas a la ruta ...
... de ts:
this.router.navigateByUrl('/details', { state: { hello: 'world' } });
... desde la plantilla HTML:
<a routerLink="/details" [state]="{ hello: 'world' }">Go</a>
Y para recogerlo en el componente de destino:
Tarde, pero espero que esto ayude a alguien con Angular reciente.
fuente
Solución con ActiveRoute (si desea pasar un objeto por ruta, use JSON.stringfy / JSON.parse):
Prepare el objeto antes de enviarlo:
Reciba su objeto en el componente de destino:
fuente
super.ngOnInit();
?El tercer enfoque es la forma más común de compartir datos entre componentes. puede inyectar el servicio del elemento que desea usar en un componente relacionado.
fuente
Pase usando JSON
fuente
use un servicio compartido para almacenar datos con un índice personalizado. luego envíe ese índice personalizado con queryParam. Este enfoque es más flexible .
.
fuente
di que tienes
y desea pasar datos a component2.ts .
en component1.ts es una variable con datos dicen
fuente
Puede usar BehaviorSubject para compartir datos entre componentes enrutados. Un BehaviorSubject tiene un valor. Cuando se suscribe, emite el valor inmediatamente. Un sujeto no tiene un valor.
En el servicio.
En el componente puede suscribirse a este BehaviorSubject.
Nota: El asunto no funcionará aquí, solo necesita usar el Asunto de comportamiento
fuente