如何告诉组件等待所有元素的组件加载到A-Frame中?

时间:2017-10-11 01:44:14

标签: aframe

我已经阅读了有关初始化和使用组件的初始化的信息。我也知道您可以在组件中指定依赖项。但是,如果我不知道哪些是依赖项,如果我想最后加载一个组件,因为它取决于其他元素属性,该怎么办?

例如,我目前正致力于处理多个网格名称的对撞机。现在,我见过的碰撞器(来自Dmarcos,Super-Hands)我看到他们用getObject3D(' mesh')读取它。我已经用threejs创建了一些自定义元素,并且我已经指定了不同的网格名称。我想要阅读由不同组件设置的所有网格,以便我的对撞机工作。

但为此,我需要等待所有组件的所有网格。当所有组件都已加载到实体中时,有没有办法让我知道?

我现在有几种解决方案正在发生:

  1. 手动添加我正在编写的组件的依赖项。这可以暂时解决问题,但我无法将组件发布到GitHub。
  2. 手动连接到我有一个事件监听器的每个组件,它将在加载和设置后触发。
  3. 编写一个可用作加载机制的组件。为此,我认为我需要向所有组件注入某种代码(使用原型?),因此我可以触发一个就绪事件。
  4. 投票机制。我禁止对撞机加载一秒钟,或者继续轮询直到它找到一个网格物体(由于它以异步方式工作,可能会有问题)。

2 个答案:

答案 0 :(得分:3)

另一种选择是,在第一次调用play()方法时运行您的设置代码,而不是init()。请注意,如果场景暂停和取消暂停,则可以再次调用play(),因此可能会设置this.initialized = true之类的标记并检查,以便您不进行两次设置。

答案 1 :(得分:2)

如何循环遍历实体的DOM属性,检查属性名称是否是一个组件,如果它是一个componentinitialized事件的组件,如果它没有加载,则等待它?

for (var i = 0; i < yourEntityEl.attributes.length; i++) {
  if (yourEntityEl.attributes[i].key in AFRAME.components) {
    // Wait for all to load (e.g., count them up and increment a counter or Promise.all).
  }
}