Aframe 如何在a-frame中设置一个组件,该组件可以聚合连接到同一实体的其他组件的数据?

Aframe 如何在a-frame中设置一个组件,该组件可以聚合连接到同一实体的其他组件的数据?,aframe,Aframe,场景 我正在尝试创建一个由两个组件组成的“系统”,其中有一个主组件,聚合器组件和多个子源组件组件,将数据提供给聚合器。收到所有数据后,聚合器组件将在父实体上运行一些函数。我使用的是a帧0.8.2 最小示例 为了以最简单的形式演示逻辑,下面是一个示例,其中3个子组件连接到一个实体,每个子组件通过将它们推入作为聚合器组件架构一部分的数组来向父组件传递字符串 这是主组件聚合器 AFRAME.registerComponent('aggregator', { schema: {

场景

我正在尝试创建一个由两个组件组成的“系统”,其中有一个主组件,
聚合器
组件和多个子
源组件
组件,将数据提供给聚合器。收到所有数据后,聚合器组件将在父实体上运行一些函数。我使用的是a帧
0.8.2


最小示例

为了以最简单的形式演示逻辑,下面是一个示例,其中3个子组件连接到一个实体,每个子组件通过将它们推入作为聚合器组件架构一部分的数组来向父组件传递字符串

这是主组件
聚合器

AFRAME.registerComponent('aggregator', {

        schema: {
            testarray: {type: 'array', default: []},
        },

        update: function(){
            //to demonstrate problem
            console.log(this.data.testarray)
        },

})
以及子组件

AFRAME.registerComponent('source', {

        dependencies: ['aggregator'],

        multiple: true,

        schema: {
            teststring: {type: 'string', default: ''},
        },

        init: function(){          
            var string = this.data.teststring
            var aggArray = this.el.getAttribute('aggregator').testarray
            aggArray.push(string)
            this.el.setAttribute('aggregator', 'testarray', aggArray)          
        },

})
下面是测试它的HTML

<a-scene>
      <a-entity
        id="aggregatortest"
        source__one="teststring:testone"
        source__two="teststring:testtwo"
        source__three="teststring:testthree">
      </a-entity>
</a-scene>
(显然看不到太多,但如果打开控制台,您将看到一个“空”数组(实际上不是空的,但看起来是空的)


问题

正如您将看到,如果运行或查看上述示例,聚合器组件的
testaray
在更新时为“空”。我知道数据实际上正在成功传递,就像我查看控制台中的组件一样,我可以看到数组已更新,因为它是在组件
data
,它没有被upd但是,这是一个问题,因为如果我尝试在聚合器的更新中运行某些函数(取决于传递的数据),它将不起作用

我做错了什么吗?我需要等待加载什么吗?还是一些内部事件?我希望每次初始化
源组件时(在本例中为3次),它将强制在
聚合器
组件中进行更新,这显然是某种原因,但不是我可以使用的方式,因为我无法在更新函数中访问更新的架构属性


任何建议都将不胜感激,如果更多信息或真实背景有帮助,请让我知道。

tldr:不要获取对
testarray的引用
克隆它:

var aggArray = this.el.getAttribute('aggregator').testarray.slice(0)
和我一样,克隆@slice(0)是David Walsh推荐的



用这句简单的话

var aggArray = this.el.getAttribute('aggregator').testarray
您可以获取对
testarray
的引用


因此,对
aggArray
所做的任何更改都将应用于
聚合器.testarray
。请在此查看。我删除了
setAttribute
位,数组仍有新元素

现在,请记住,如果两个数组都是相同的,那么更新甚至不会启动-为什么会启动呢,旧数据和新数据都完全相同


最后,你必须提供一个数组的复制/克隆->所以更新函数可以正常工作。

认为它是一个bug,很高兴我在工作中使用那些该死的C++指针:谢谢你,Piotr,这很好。谢谢你的解释。如果你能为我的理解做一些阐述,我将不胜感激。当你说如果每次的值都相同,更新就不会触发时,你明白了吗?但我不认为它们是一样的?每次启动源时,它都会将一个新项推到数组中,这样它就会不同,不是吗?其次,在你的第二个示例中,我可以看到你在tick函数中使用新数组,是否有你还可以使用其他函数来访问数据,因为init或update都不能?Nick,我会尽快解释1)只要我有时间,2)-你可以从组件中的任何函数访问数据-因为它是组件的一个成员:谢谢Piotr,我想我明白了-我引用了原始数组,比如说在那一点上有1个项目,然后我推另一个到它,现在有2个,所以当我使用2的新数组setAttribute()时,它已经有2个了。如果这是正确的,那么我猜我的困惑源于我的期望,即如果组件的任何元素以任何方式发生更改,update函数都会启动,但似乎需要通过setAttribute()等特定方式进行这些更改才能启动更新?如果是这样的话,我想知道您是否可以手动触发更新功能?