不保存组件数据之间的角度通信

Posted

技术标签:

【中文标题】不保存组件数据之间的角度通信【英文标题】:Angular Communication between components data is not saved 【发布时间】:2019-10-30 06:09:24 【问题描述】:

我正在尝试在我的 2 个组件之间进行通信。在第一个组件中,我有项目列表,我想将其中一个项目发送到我的第二个组件以编辑它们。在第一个组件中,我在我的服务中设置数据,在第二个组件中,我想从服务中读取这些数据,数据即将到来,但是当我在离开 ngOnInit 方法后将此数据设置到我的数组时,我的数组是清晰的。

这是我在第一个组件中的 onClick 编辑按钮

editPurchasesInvoice(i : number) 
this.purchasesService.editPurchasesInvoice(this.purchasesInvoices[i].gpInvoiceitemsByGpInvoiceRecid);
this.router.navigate(['new'], relativeTo: this.route);

服务方法

subject = new Subject<any>();

editPurchasesInvoice(invoiceItems: GpInvoiceitem[]) 
    this.subject.next(invoice: invoiceItems);
  

  getEditedInvoice(): Observable<any> 
    return this.subject.asObservable();
  

这是我的第二个组件

ngOnInit() 
    this.subscription = this.purchaseService.getEditedInvoice().subscribe( data => 
      this.invoiceItems.push(data.invoice);
    );
  

离开ngOnInit方法后数据丢失。

【问题讨论】:

你想从哪里访问它? “离开 ngoni” 是什么意思? 我想在 html 文件中使用我的 invoiceItems 数组并显示所有这些项目。在将数据推送到 invoiceItems 数组后的 ngOnInit 方法中,它不为空,其他任何地方的数组都是空的 信息太少,无法重现。您应该发布您的 HTML 结构和两个组件之间的关系。一种可能的解决方案是在您的服务中使用BehaviorSubject 而不是Subject 您的服务类是否有多个实例?你是如何注射它们的? @PierreDuc 我使用了 BehaviorSubject,现在它工作正常,显示数据我还更改了将 invoiceItems 初始化为 this.invoiceItems = data.invoice; 【参考方案1】:

只有在传输新数据后才会收到对Subject 的订阅。 BehaviourSubject 将在订阅时发出最后推送的数据。也可以使用ReplaySubject,基本一样,但是可以控制发射次数,不需要指定初始值。

如 cmets 中所述,您应该更新您的服务以使用这两者中的任何一个,考虑到您的数据,我建议ReplaySubject

readonly subject = new ReplaySubject<any>(1)

editPurchasesInvoice(invoiceItems: GpInvoiceitem[]) 
  this.subject.next(invoice: invoiceItems);


getEditedInvoice(): Observable<any> 
  return this.subject.asObservable();

【讨论】:

以上是关于不保存组件数据之间的角度通信的主要内容,如果未能解决你的问题,请参考以下文章

使用服务的角度子到父通信

两个独立组件之间的通信 angular 2

Blazor(服务器端)在同级组件之间进行通信

兄弟组件通信角度6

12.组件化开发2-非父子组件之间通信-祖先和后代之间的通信

组件之间的通信