typescript 如何将事件从一个子节点发送到另一个子节点的父节点?

o2gm4chl  于 2022-11-18  发布在  TypeScript
关注(0)|答案(2)|浏览(158)

我有一个从表单中获取数据的子组件,并通过@Output装饰器将其传递给父组件。

export class FormChildComponent {

    @Output() doSomethingWithData: EventEmitter<any> = new EventEmitter<any>()

    ...

    getDataFromForm(){
        ...

        this.doSomethingWithData.emit(form.values);
        
    }
    renderSomething(?data){
       //This needs to be called in anther child after the event got 
       triggered and the data got processed in the parent

    }

}

在父组件中,我对子组件中的按钮按下事件的数据进行了一些处理。之后,我必须根据另一个子组件中处理过的数据来呈现一些东西,该子组件与上面的子组件类型相同。
parent.component.html

<FormChildComponent (doSomethingWithData)="processData($event)">

parent.component.ts

processData($event: object){
    
    doSomething($event);

}

在子级和其父级之间传递事件和数据的最佳实践是什么?

sd2nnvve

sd2nnvve1#

处理多个组件上的输入和输出可能会变得很混乱,我更喜欢创建一个服务来从事件中发出和订阅。

export type DataType = { name: string };

@Injectable({ providedIn: 'root' })
export class MyService {
  dataSubject = new Subject<DataType>();
}

只需在需要的任何地方注入服务,在主题上调用next以发出事件,并订阅要对事件执行操作的主题。
发射

export class ChildOneComponent {
  data = { name: 'chris' };

  constructor(private myService: MyService) {}

  emit() {
    this.myService.dataSubject.next(this.data);
  }
}

对事件采取行动

export class ChildTwoComponent {
  subscription = new Subscription();

  constructor(private myService: MyService) {}

  ngOnInit() {
    this.subscription = this.myService.dataSubject.subscribe(this.processData);
  }

  processData(data: DataType) {
    console.log('Got: ', data);
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

更好的是,您可以只使用pipe操作符和async管道来处理数据并将其注入到html中,而无需手动订阅/取消订阅。
第一个
示例:https://stackblitz.com/edit/angular-ivy-al3yqs?file=src/app/child-two/child-two.component.ts
我知道你说过子组件是相同类型的,所以我不确定你的代码到底是什么样子的,因为组件做的是两件不同的事情。你可能需要详细说明。
是否是两个组件相互订阅?是否是一种组件订阅另一个组件而另一个组件订阅另一个组件的方式?是否是一个组件相互任意订阅的列表?等等。

rqcrx0a6

rqcrx0a62#

你应该只在child上定义一个变量并使用@Input()装饰器。@Input() prop: YourType; .
然后,您可以使用以下命令将数据从父级传递到子级:

<FormChildComponent [prop]="dataToPassToChild" (doSomethingWithData)="processData($event)">

这通常是将数据从父组件传递到子组件的最佳实践。相反的方式已经包含在您的问题中(使用@Output()装饰器)。
在某些情况下,您希望提取一些处于独立状态的属性。您应该使用服务来实现这一点。

相关问题