将函数作为具有Angular

时间:2018-03-17 01:01:51

标签: angular

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

到目前为止,我为每个操作都创建了Input属性,以利用是否显示操作,因此我可以根据组件的使用位置显示或不显示操作(因为我可以&# 39;如果玩家不在机库上,则显示"机库下降"动作。)

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

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

@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的函数,这个函数被&#34; unmount&#34;调用,这是组件执行的函数单击该操作。 ac.complete()仅用于隐藏加载指示符。

为了清楚起见,让我们调用呼叫者组件&#34; CallerComponent&#34;。

这种方法的问题在于关键字&#34; this&#34;在执行的函数中不是&#34; CallerComponent&#34;但是&#34; WeaponComponent&#34;。

之一

我猜大多数人都要点击&#34;回答&#34;告诉我使用Output装饰器而不是Input,但这不会解决我的问题。的确,&#34; WeaponComponent&#34;需要知道函数何时执行,隐藏加载指示器。因此,我无法在&#34; EventEmitter&#34;上发射。当然,我可以在输出方法中传递一个对&#34; WeaponComponent&#34;的引用。我可以称之为&#34;完成&#34;隐藏加载指标的方法,但我想知道是否有比这更好的解决方案。

0 个答案:

没有答案