我有问题。我不知道如何将对象从一个组件发送到另一个组件。
在第一个组件 cinema.component.html 中,我有以下函数调用:
<a title="Reserve" (click)="openReservationPage(repertoire)">Reserve</a>
在 cinema.component.ts 文件中,对于 .html 我有类似的内容:
openReservationPage(repertoire: UpcomingRepertoire) {
this.router.navigate(['/reserve', {repertoire: JSON.stringify(repertoire)}]);
}
我的 app.routes.ts 文件包含适当的路由:
{ path: 'reserve', component: ReserveFormComponent }
如何在其他网页 reserve-form.component.ts 和 reserve-form.component.html 中使用此保留曲目对象?
答案 0 :(得分:1)
作为标题中问题的答案,我会说创建一个服务来在组件之间传递数据。
由于它是路由器实现,您可以将该指令作为路由参数传递。
请按照以下步骤操作:
1)修改app.routes.ts中的路线以获取参数
{ path: 'reserve/:repertoire', component: ReserveFormComponent }
2)在cinema.component.ts中将曲目作为参数传递
this.router.navigate(['/reserve',JSON.stringify(repertoire)]);
3)在reserve-form.component.ts中提取参数
首先你需要导入
import {ActivatedRoute } from "@angular/router";
技术1
repertoire:any;
constructor(private activatedRoute: ActivatedRoute) {
this.repertoire = JSON.parse(activatedRoute.snapshot.params["repertoire"]);
}
技术2
import { Subscription } from "rxjs/Rx";
private subscription: Subscription;
repertoire:any;
constructor(private activatedRoute: ActivatedRoute) {
this.subscription = activatedRoute.params.subscribe(
(param: any) => this.repertoire = JSON.parse(param['repertoire'])
);
}
ngOnDestroy() { // here we unsubscribe to the observable
this.subscription.unsubscribe();
}
进一步说明:
当您确定每次导航到组件时都会传递参数时,将采用技术1 。
技术2 是一旦发布了一个param,就会对observable进行订阅,但不要忘记在ngOnDestroy()组件的生命周期方法中取消订阅以防止内存泄漏。
更为可取,因为有时会出现一个方案,即在创建快照方法无法捕获的组件之后将参数传递给组件,并且它与不同的方案相比,技术1中的基本方案更灵活。
答案 1 :(得分:0)
以下链接说明了如何执行此操作。我最近用这个来创建一个消息服务。下面的示例显示了简单消息传递服务的代码。它允许您在组件之间传递数字,只需更改为我猜。您也可以写出本地存储,但似乎服务更受欢迎。一旦你掌握了它们,它们就很容易重复使用。
希望这有帮助
Sharing Data Between Angular Components - Four Methods
消息服务(PmMessageService)
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable()
export class PmMessageService
{
private pillMenuIndexBS = new BehaviorSubject <number> (null);
pillMenuIndex = this.pillMenuIndexBS.asObservable();
constructor() {}
setPillMenuIndex(index : number)
{
this.pillMenuIndexBS.next(index);
}
}
消耗消息服务的组件,设置值
import { Component, OnInit } from '@angular/core';
import { PmMessageService } from '../pm-message-service/pm-message.service'
import { BrowserModule } from '@angular/platform-browser';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
@Component({
selector: 'app-pm-configure',
templateUrl: './pm-configure.component.html',
styleUrls: ['./pm-configure.component.css']
})
export class PmConfigureComponent implements OnInit
{
constructor (private messageService : PmMessageService) {}
ngOnInit()
{
this.messageService.setPillMenuIndex(1);
}
}
组件消费和订阅。
import { Component, OnInit } from '@angular/core';
import { PmMessageService } from '../pm-message-service/pm-message.service'
import { BrowserModule } from '@angular/platform-browser';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
@Component({
selector: 'pm-bs-navbar',
templateUrl: './pm-bs-navbar.component.html',
styleUrls: ['./pm-bs-navbar.component.css']
})
export class PmBsNavbarComponent implements OnInit
{
tabActiveNumber;
constructor (private messageService : PmMessageService) {}
ngOnInit()
{
this.messageService.pillMenuIndex.subscribe(index => this.tabActiveNumber = index)
}
}