初始化两个Viewer时自定义ToolbarExtension未注册的问题
问题分析与解决方案
核心原因
Autodesk Viewer的扩展注册是全局生效的,但初始化第二个Viewer实例时,自定义扩展可能还未完成全局注册,或者多实例启动时的扩展加载逻辑触发了冲突——你仅在主Viewer的初始化配置中传入扩展数组,第二个Viewer启动时,全局扩展管理器中可能还未同步到ToolbarExtension,导致加载失败。
解决方法
1. 提前全局注册扩展(关键)
将ToolbarExtension的注册代码放在所有Viewer实例初始化之前,确保两个Viewer启动时,扩展已存在于全局扩展管理器中:
// 先注册扩展,放在任何Viewer初始化代码的最前面 Autodesk.Viewing.theExtensionManager.registerExtension('ToolbarExtension', ToolbarExtension); // 初始化主Viewer,保持原有初始化时加载扩展的方式 const mainViewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('main-viewer')); const initOptions = { extensions: ['ToolbarExtension'] }; mainViewer.start(null, null, null, null, initOptions); // 初始化第二个Viewer(不需要传入该扩展,避免不必要的加载) const secondaryViewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('secondary-viewer')); secondaryViewer.start();
2. 同步初始化时序(避免冲突)
如果提前注册后仍有问题,可以等待主Viewer的扩展加载完成后,再初始化第二个Viewer:
// 先注册扩展 Autodesk.Viewing.theExtensionManager.registerExtension('ToolbarExtension', ToolbarExtension); // 按顺序初始化Viewer async function initViewers() { const mainViewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('main-viewer')); const initOptions = { extensions: ['ToolbarExtension'] }; await mainViewer.start(null, null, null, null, initOptions); // 主Viewer扩展加载完成后,再初始化第二个Viewer const secondaryViewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('secondary-viewer')); secondaryViewer.start(); } initViewers();
3. 确保扩展代码的实例独立性
检查ToolbarExtension的代码,避免绑定到单一Viewer实例的全局变量,在扩展的load方法中使用传入的viewer参数:
class ToolbarExtension extends Autodesk.Viewing.Extension { load(viewer) { this.viewer = viewer; // 使用实例化时传入的viewer,而非全局变量 // 你的工具栏按钮创建逻辑 return true; } }
内容的提问来源于stack exchange,提问作者Gustavo da Costa e Silva
相关产品推荐
相关产品推荐

