我正在创建一个小游戏,我有一个显示武器名称的组件,我们称之为“WeaponComponent” . 武器名称旁边应该出现一些按钮,允许用户执行某些操作,如“fire”,“drop”,“reload”等...但是,这些操作不应该调用相同的代码,具体取决于组件的方式例如,无论我攻击怪物还是其他玩家,“火”动作都应该采取不同的行动 . 请注意,这只是一个例子,更多的变量可以影响要执行的代码 .

到目前为止,我为每个操作都创建了 Input 属性,利用是否显示了操作,因此我可以根据组件的使用位置显示或不显示操作(因为我无法显示"drop in hangar"操作,如果例如,玩家不在机库上) .

此外,每个操作按钮都会显示一个微调器图标,直到操作完成 . 实际上,大多数操作都会进行服务器端调用,所以我想显示一个不错的加载指示器 .

由于单击某个动作时要执行的代码取决于某些变量,因此我想将单击按钮时要执行的函数传递给该组件 . 所以我这样做了:

@Input()
public unmountAction: (id: number) => void | Promise<void>;

...

public async unmount(ac: ActionComponent): Promise<void> {

    if (this.unmountAction) {
        await Promise.resolve(this.unmountAction(this.data.id));
    }

    ac.complete();
}

所以我有一个 Input 接受一个不返回任何函数或 Promise 的函数,这个函数由"unmount"调用,这是单击动作时组件执行的函数 . ac.complete() 仅用于隐藏加载指示器 .

为了清楚起见,让我们调用调用者组件“CallerComponent” .

这种方法的问题在于,执行函数中的关键字“this”不是“CallerComponent”中的关键字,而是“WeaponComponent”中的关键字 .

我猜大多数人都要点击"answer"告诉我使用 Output decorator而不是 Input ,但是,这只是't solve my issue. Indeed, 972305 needs to know when the function is done executing, to hide the loading indicator. Therefore, I can'只是在"EventEmitter"上发出 . 当然,我可以在输出方法中传递"WeaponComponent"的引用,我可以在其上调用隐藏加载指示符的"done"方法,但我想知道是否有比这更好的解决方案 .