基于Angular5的A-Frame应用中,aframe-state-component能否跨场景追踪状态?
关于aframe-state-component跨场景状态丢失的问题解答
你的假设完全正确——aframe-state-component确实仅支持在单个场景内使用,没办法直接跨多个A-Frame场景共享状态。
为什么会出现状态重置?
这个组件的核心设计是将状态实例绑定到单个场景的system上,每个A-Frame场景在初始化时都会创建自己独立的state系统实例。也就是说,你切换场景时,新场景会重新初始化一套全新的状态变量,和之前场景的状态完全是两个互不相干的对象。你通过AFRAME.scenes[0].systems.state.state.score访问到的只是当前活跃场景的私有状态,自然看不到其他场景的状态数据。
不用angular-redux的替代方案
既然你更倾向于轻量的实现方式,可以基于Angular的单例服务封装一个全局状态层,来打通多个场景的状态同步:
创建Angular全局状态单例服务
利用Angular的根注入器创建一个全局共享的状态容器:@Injectable({ providedIn: 'root' }) export class GlobalAframeStateService { // 这里定义你的全局状态变量 public globalState = { score: 0, config: {} }; }编写A-Frame同步组件
注册一个自定义组件,负责把全局状态和当前场景的state组件做双向同步:AFRAME.registerComponent('sync-global-state', { init() { // 从Angular注入器获取全局状态服务 const globalStateService = this.el.sceneEl.systems['angular-injector'].get(GlobalAframeStateService); const globalState = globalStateService.globalState; // 初始化场景state为全局状态 this.el.sceneEl.systems.state.setState({ ...globalState }); // 监听场景state变化,同步回全局状态 this.el.sceneEl.systems.state.addEventListener('statechanged', (evt) => { Object.assign(globalState, evt.detail.state); }); } });在场景中启用同步
给每个A-Frame场景添加这个同步组件即可:<a-scene sync-global-state state="score: 0"></a-scene>
另外还有更直接的方式:完全绕过aframe-state-component,在A-Frame的自定义组件里直接注入Angular的全局状态服务,直接读写状态变量,这样就彻底摆脱了场景绑定的限制。
内容的提问来源于stack exchange,提问作者vt5491
相关产品推荐
相关产品推荐

