首页 > 解决方案 > aframe-state 组件:在删除由 bind-for 生成的实体时未调用删除函数

问题描述

我有这样的模板:

<a-entity bind-for="for: item; in: creatures; key: id; updateInPlace: true">
  <template>
    <a-entity 
        bind-item__uw-id="item.id"
        bind-item__position="item.position"
        bind-item__rotation="item.rotation"
        bind-item__scale="item.scale"
        bind-item__uw-name="item.name"
        bind-item__gltf-model="item.url"
        animation-mixer></a-entity>
  </template>
</a-entity

在某些事件之后,我想从我的场景中删除所有实体。我正在尝试通过以下方式进行操作:

export const cleanScene = () => {
    const camera = document.querySelector('a-camera')
    if (camera) {
        camera.parentNode.removeChild(camera);
        camera.destroy();
    }

    removeAframEntities('a-entity[bind-item__uw-id]');
    removeAframEntities('a-entity[bind-for]');
    removeAframEntities('a-entity');
    // document.querySelector('a-scene').systems.state.subscriptions = []; // - workaround
}

function removeAframEntities(selector) {
    document.querySelectorAll(selector).forEach(e => {
        e.parentNode.removeChild(e);
        if (e.destroy) {
            e.destroy();
        }
    });
}

然后,当我向该州分派一个事件时,我收到以下错误:

Uncaught TypeError: Cannot read property 'emit' of null
    at NewComponent.renderItemsInPlace (aframe-state-component.js:954)
    at NewComponent.<anonymous> (aframe-state-component.js:906)
    at NewComponent.onStateUpdate (aframe-state-component.js:1039)
    at NewSystem.<anonymous> (aframe-state-component.js:367)

这是因为没有要更新的实体,但状态中仍有订阅者。显然,remove()没有为模板循环生成的实体调用该函数(所有其他订阅者都消失了)。以前我只通过调用来删除实体removeAframEntities('a-entity');,我尝试显式删除生成的实体和具有 bind-for 属性的实体,但这并没有解决我的问题。我做错了什么?

更新

刚刚检查了组件代码,结果发现 bind-for 和 bind-item 组件甚至没有remove()功能。他们应该如何被删除?

标签: aframe

解决方案


该错误已在此处修复:https ://github.com/supermedium/superframe/pull/279 ,但我尚未检查它是否已发布。


推荐阅读