angular - 如何从通用事件的子组件在父组件上执行方法

标签 angular typescript

我想要做的事情的要点是创建一个通用子组件,该组件将某种类型的操作列表作为参数。这些操作将作为按钮在子组件上动态生成,并发出一个事件,该事件将被父组件捕获并在那里调用适当的方法。

我试图避免只传递绑定(bind)到父级的函数,因为它感觉不对。

理想情况下, parent 会传递如下数据:

[{ name: 'Edit', method: 'onEdit' }, { name: 'Delete', method: 'onDelete' }]

子组件有一个像这样的发射器:

@Output() actionEvent: EventEmitter<MyGreatEvent> = new EventEmitter();

并生成如下按钮:

<button mat-menu-item *ngFor="let action of actions" (click)="actionEvent.emit({method: action.method, item: row})">
    {{action.name}}
</button>

其中 row 是 mat-table 行中的数据。

然后通过事件绑定(bind)在父级中捕获它,例如:

handleEvent(event: MyGreatEvent): void {
    // ???
    // profit
}

我尝试了一些方法,但总是忘记词法上的 this,最后我又回到了 vanilla JS 来尝试解决问题。基本上我能找到的关于发射器的所有内容都描述了事件发射器和方法之间的一对一关系。试图获得通用但仍然是 typescript-y。我觉得我错过了什么。非常感谢任何帮助!

编辑:我created a Stackblitz希望能够说明我的问题。

最佳答案

克服这个问题的一种方法是在父组件中命名函数并传递如下值。 最好不要将父组件实例作为@Input

直接传递给子组件,这总是好的
onEdit(item) {
  // edit item
}

onDelete(item) {
  // delete item
}

handleEvent({method, data }: MyGreatEvent): void {
  if (this[method] && typeof this[method] === 'function') {
    this[method](data);
  }
}

关于angular - 如何从通用事件的子组件在父组件上执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54718965/

相关文章:

angular - 如何在 Ionic Page 中定义可选的段参数?

javascript - Angular:根据环境导入不同的脚本

angular - 如何将服务变量与组件 Angular 2 绑定(bind)?

javascript - 尝试将 braintree-web 集成到 Angular2 中

Angular 7 使用查询字符串打开新选项卡

javascript - element.all 无法在 Protractor 测试中拆分数据

angular - 如何将数组转换为json数组对象

angular - Redux - 如何在大型应用程序中组织商店

typescript - fp-ts在mapLeft内部调用异步函数

javascript - NG 构建失败模块解析失败 : Unexpected token - nothing has changed