gpt4 book ai didi

javascript - A 型框架 : When are all my children fully initialized?

转载 作者:行者123 更新时间:2023-12-02 22:28:38 25 4
gpt4 key购买 nike

我有一个 A 形框架组件,它在某个时候创建​​一个“基础”实体,上面挂着一堆子元素(基本上是带有彩色面的盒子)。完成所有这些子元素(包括网格)后,我想使用 geometry-merger 合并它们的几何图形。成分。问题是,当我添加此组件时,所有子组件都需要完全初始化:否则,子几何图形将无法正确合并(如果它们在每个子组件中尚不可用)。

我认为等待“base”实体中的 loaded 被触发就足够了,代码如下:

base.addEventListener('loaded', (e) => {
base.setAttribute('geometry-merger', {preserveOriginal: true});
base.setAttribute('material', {vertexColors: 'face'});
});

(在我正在编写的组件的 init 函数中)。

事实上,它在 Firefox 中就像一个魅力,但在 Chrome 中却不然。

我已经对其进行了调试,似乎在 Chrome 中,即使几何图形(属性 3Dobject)仍未在子项中设置,“已加载”也会在“基础”实体上触发(因此据我了解,它们并未完全“加载”)。

那么,问题是:实体的生命周期中是否有任何事件或某个钩子(Hook)在所有子项初始化时运行?

我找到了一个最小的示例:cubes-loaded.htmlcubes-loaded.js,如下:

<!DOCTYPE html>
<html>
<head>
<script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
<script src="cubes-loaded.js"></script>
</head>
<body>

<a-scene>

<a-entity cubes position="0 0 -4"></a-entity>

</a-scene>
</body>
</html>
AFRAME.registerComponent('cubes', {
init: function () {
this.base = document.createElement('a-entity');
this.base.addEventListener('loaded', (e) => {
console.log("Base loaded, child object3DMap:", this.base.children[0].object3DMap);
});
this.el.appendChild(this.base);
let box = document.createElement('a-entity');
box.setAttribute('geometry', {primitive: 'box'});
this.base.appendChild(box);
},
play: function () {
console.log("Play run, child object3DMap:", this.base.children[0].object3DMap);
}
});

在 Firefox 中,此示例写道:

Base loaded, child object3DMap: Object { mesh: {…} }
Play run, child object3DMap: Object { mesh: {…} }

在 Chrome 中,此示例写道:

Base loaded, child object3DMap: {}
Play run, child object3DMap: {mesh: J}

顺便说一句,在 play 中运行代码似乎是确保网格物体位于子项中的好方法。

最佳答案

在玩这个最小的例子时,我想我找到了问题的答案。该示例的问题在于,基类是在子级附加到它之前插入到 DOM 中的。这样,“loaded”事件就有可能在子进程初始化完成之前被触发,显然 Chrome 就是这么做的。在 Firefox 中,似乎在子进程初始化之前不会触发该事件,至少在本例中是这样。

因此,只需在将子级附加到 DOM 之后,将基础附加到 DOM 即可修复该示例:

AFRAME.registerComponent('cubes', {
init: function () {
this.base = document.createElement('a-entity');
this.base.addEventListener('loaded', (e) => {
console.log("Base loaded, child object3DMap:", this.base.children[0].object3DMap);
});
let box = document.createElement('a-entity');
box.setAttribute('geometry', {primitive: 'box'});
this.base.appendChild(box);
this.el.appendChild(this.base);
}
});

抱歉打扰了,一旦您了解了附件的顺序,答案就很简单了。

关于javascript - A 型框架 : When are all my children fully initialized?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58980454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com