【问题标题】:Passing Data between sibling components在兄弟组件之间传递数据
【发布时间】:2019-12-30 20:55:58
【问题描述】:

我正在尝试在两个同级组件之间传递数据,组件结构如下所示。我需要在两个兄弟组件之间传递数据,

我不想让组件成为父子组件,而是需要在兄弟组件之间传递数据

但是当按钮被点击时,我得到了错误:

TypeError: 无法读取未定义的属性“settDate”

不确定我们是否在这里遗漏了什么

【问题讨论】:

  • 我的第一个想法是。要么使用共享服务。或者通过Output()从每个兄弟组件发出信息到父组件(PRJ Shipping Component),然后将该信息从父组件分别发送回每个兄弟组件。
  • 这里有一篇文章,如果使用共享服务路由可能会有所帮助。 dev.to/avatsaev/…

标签: javascript angular typescript angular7


【解决方案1】:

由于您的组件在同一个父组件下,我假设 PRJ Shipping Component 是一个 SMART 组件,其余的是 DUMB 组件(它们只与输入和输出交互)

所以您需要向reportingFilterComponent 添加一个输出并发出过滤器值,然后PRJ Shipping Component 具有事件处理程序来获取该值,并将其作为输入传递给tjl shipment component,如下所示

reportingFilterComponent.ts

@Output() filterChange : EventEmitter<ShipDateFilterModel[]> = new EventEmitter<ShipDateFilterModel[]>()

filterButtonClick() {
  this.filterChange.emit(/. your filter value../);
} 

PRJ Shipping Component.html

<app-reporting (filterChange)="onFilterChange($event)"></app-reporting>

<app-tjl-shipment [filter]="filter"></app-tjl-shipment>

PRJ Shipping Component.ts

filter: ShipDateFilterModel[];

onFilterChange(event:ShipDateFilterModel[]) {
   this.filter = event;
}

tjl-shipment.component.ts

@Input() filter: ShipDateFilterModel[];

ngOnChanges(changes: SimpleChanges) {

  if (changes.filter && changes.filter.currentValue) {
     // do whatever is needed
  }
}

改进

为了保持 DUMB 组件 DUMB,他们不应该进行任何 http 调用或其他操作。所以说最好 PRJ Shipping Component 接收过滤器值并执行过滤器操作并将过滤后的数据传递给 tjl-shipment.component

另一种解决方案

您可以创建一个服务来保存组件之间的数据并通知更改,但在您的情况下它是needless complexity

【讨论】:

  • 我得到错误`'输出'接受的参数太少,无法在此处用作装饰器。你的意思是先调用它然后写'@Output()'?`当我试图声明输出时
  • 我需要在按钮标签中声明filterChange吗?
  • @trx @Output() 是正确的,注意我把整个代码写在这里让你明白了,其他部分也可能有语法错误
  • filterChange 需要在reportingFilterComponent.ts 组件中声明,您只需在按钮单击中发出它
猜你喜欢
  • 2018-07-27
  • 2022-09-28
  • 2020-12-18
  • 2018-10-03
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 2021-12-26
  • 2020-02-05
相关资源
最近更新 更多