¿Cómo paso datos a componentes enrutados angulares?
En una de mis plantillas de rutas de Angular 2 (FirstComponent) Tengo un botón
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
MiGol 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 aSegundo componente 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 supongoNo puedo pasar datos complejos (por ejemplo, unobjeto como propiedad3) en-url;
2º ENFOQUE
Una alternativa sería incluir SecondComponent comodirectiva en primer componente.
<SecondComponent [p3]="property3"></SecondComponent>
Sin embargo quieroruta a ese componente, no lo incluya!
3er ENFOQUE
La solución más viable que veo aquí sería usar unServicio (por ejemplo, FirstComponentService) a
Tienda los datos (_firstComponentService.storeData ()) en routeWithData () en FirstComponentrecuperar los datos (_firstComponentService.retrieveData ()) enngOnInit () enSegundo componenteSi 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 falta otraenfoques potenciales para pasar los datos entre componentes, particularmentecon la menor cantidad de código posible