ในเทมเพลตหนึ่งในเส้นทางของ Angular 2 ( FirstComponent ) ฉันมีปุ่ม
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
เป้าหมายของฉันคือการบรรลุ:
คลิกปุ่ม -> เส้นทางไปยังส่วนประกอบอื่นในขณะที่เก็บรักษาข้อมูลและไม่ใช้ส่วนประกอบอื่นเป็นคำสั่ง
นี่คือสิ่งที่ฉันพยายาม ...
แนวทางที่ 1
ในมุมมองเดียวกันฉันกำลังเก็บรวบรวมข้อมูลเดียวกันตามการโต้ตอบของผู้ใช้
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
}
}
ปกติฉันจะไปที่SecondComponentโดย
this._router.navigate(['SecondComponent']);
ในที่สุดก็ผ่านข้อมูลโดย
this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);
ในขณะที่ความหมายของการเชื่อมโยงกับพารามิเตอร์จะเป็น
@RouteConfig([
// ...
{ path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent}
)]
ปัญหาของวิธีนี้คือฉันเดาว่าฉันไม่สามารถส่งผ่านข้อมูลที่ซับซ้อนได้ (เช่นวัตถุเช่นคุณสมบัติ 3) ใน URL
แนวทางที่ 2
อีกทางเลือกหนึ่งคือการรวม SecondComponent เป็นคำสั่งใน FirstComponent
<SecondComponent [p3]="property3"></SecondComponent>
อย่างไรก็ตามฉันต้องการเส้นทางไปยังส่วนประกอบนั้นไม่รวมมัน!
แนวทางที่ 3
ทางออกที่เป็นไปได้มากที่สุดที่ฉันเห็นที่นี่คือการใช้บริการ (เช่น FirstComponentService) เพื่อ
- เก็บข้อมูล (_firstComponentService.storeData ()) บน routeWithData () ใน FirstComponent
- ดึงข้อมูล (_firstComponentService.retrieveData ()) ในngOnInit ()ในSecondComponent
ในขณะที่วิธีการนี้ดูเหมือนว่าปฏิบัติได้อย่างสมบูรณ์แบบฉันสงสัยว่านี่เป็นวิธีที่ง่ายที่สุด / หรูหราที่สุดในการบรรลุเป้าหมาย
โดยทั่วไปฉันต้องการทราบว่าฉันขาดวิธีการที่เป็นไปได้อื่น ๆ ในการส่งผ่านข้อมูลระหว่างส่วนประกอบโดยเฉพาะอย่างยิ่งเมื่อมีจำนวนรหัสน้อยลง
state
ตรวจสอบPRสำหรับรายละเอียดเพิ่มเติม ข้อมูลที่เป็นประโยชน์บางอย่างที่นี่