一个 A 框架组件上的 calling/triggering 方法的最佳实践是什么?

What is considered best practice for calling/triggering methods on one A-Frame Components from another?

例如,我有一个名为 table 的组件和一个系统 game,它侦听包含获胜者列表的 SocketIO 事件(坐在 table 的玩家)。 game 系统有效地发出它接收到的相同事件,以便每个 A-Frame 组件都可以监听它们需要的事件。在我的例子中,当 table“听到”game 系统发出的包含获胜者列表的事件时,我循环遍历每个并突出显示获胜者。目前我的粗略实现只是让 table 组件向与相应播放器具有相同 id 的元素添加一些文本。这可行,但在某些时候我想在 player 组件上调用一个函数,该函数可以做各种事情(例如播放声音、动画、改变颜色等)。

我可以看到有几种方法可以实现这一点:

  1. 获取 tableplayer 组件可以侦听并执行所需操作的方式为每个获胜玩家发出事件。

  1. 通过查找元素然后执行 playerEl.playWinningAnimation()
  2. 之类的操作,直接从 table 组件调用播放器组件上的函数

这些是否被认为是特别“糟糕的做法”?一种方法优于另一种方法的原因是什么?

我通常更喜欢发出事件,而不是直接调用函数。 一些好处:

  • 如果其他组件尚未初始化,则不会发生崩溃。
  • 如果您想将信息散布到多个实体,那就容易多了。
  • 更改组件内的功能可能会破坏该组件外部的东西可能并不明显,而事件显然是一个外部接口,因此您不太可能想象可以在不破坏东西的情况下更改它们。 更容易测试单个组件(由于松耦合)。

也就是说,在某些情况下,直接调用组件的函数是合理的。

核心 A 框架中有一些示例,例如在光线投射器上。 https://aframe.io/docs/1.2.0/components/raycaster.html#methods

通常,使用函数而不是事件进行组件间通信的主要原因是当您需要返回 answer/data 时。也许也是出于性能原因(我已经看到对 DOM 事件的成本表示担忧,但我对此没有任何确切的量化。一般来说,我认为如果它在 tick() 函数之外,而不是发生 1000 次,我希望 DOM 事件就好了。

如果这是一种单向交流,并且不是非常频繁地发生,我想我几乎总是会去参加一个活动。