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
state
el PR para obtener más detalles. Alguna información útil aquí