aframe - 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()
功能。他们应该如何被删除?
解决方案
该错误已在此处修复:https ://github.com/supermedium/superframe/pull/279 ,但我尚未检查它是否已发布。
推荐阅读
- java - 休眠搜索:Elasticsearch 传输线程 3" java.lang.OutOfMemoryError:
- html - 复选框右属性在从左到右更改时不起作用
- node.js - nodejs:自定义函数的 setInterval
- c# - 试图从 WPF 窗口打开一个新窗口,我得到 STAThread 异常
- python - 微调 TensorFlow 对象检测预训练模型
- java - 定义广播组?
- python - Power BI 中的 Python 可视化需要什么设置?任何特定的 matplotlib 包版本或系统设置?
- python - 在大量使用元类的库中,如何避免因元类冲突而惹恼用户?
- google-docs - 如何使用谷歌文档或表格作为知识连接器的输入文档
- android - RecyclerView scrollToPosition() - 使用屏幕底部边缘作为参考点(而不是屏幕顶部边缘)