问题描述
在应用启动阶段,插件加载与布局恢复存在时序问题。
当插件在 onload() 中异步后才调用 addTab() 注册自定义页签模型时,布局恢复逻辑可能先执行“无插件模型”清理,导致已持久化的自定义页签被移除。
影响
有异步初始化的插件会出现丢失自定义页签的情况
复现步骤
- 编写插件,在
onload() 中先 await 一个异步任务(例如 await new Promise(r => setTimeout(r, 1000)))。
- 异步之后再调用
this.addTab({ ... }) 注册模型。
- 通过
openTab({ custom: { id, data, ... } }) 打开一个自定义页签,并触发 saveLayout()。
- 重启应用。
- 观察:该自定义页签可能在启动时被移除,未能恢复。
实际行为
启动时 JSONToLayout() 中“移除没有插件的 tab”逻辑会检查 app.plugins[].models。
若此时插件已实例化但 onload() 尚未完成(addTab 尚未执行),则 customModelType 匹配失败,tab 被删除。
预期行为
启动恢复阶段不应自动删除插件的自定义页签,除非该插件已禁用。
问题描述
在应用启动阶段,插件加载与布局恢复存在时序问题。
当插件在
onload()中异步后才调用addTab()注册自定义页签模型时,布局恢复逻辑可能先执行“无插件模型”清理,导致已持久化的自定义页签被移除。影响
有异步初始化的插件会出现丢失自定义页签的情况
复现步骤
onload()中先await一个异步任务(例如await new Promise(r => setTimeout(r, 1000)))。this.addTab({ ... })注册模型。openTab({ custom: { id, data, ... } })打开一个自定义页签,并触发saveLayout()。实际行为
启动时
JSONToLayout()中“移除没有插件的 tab”逻辑会检查app.plugins[].models。若此时插件已实例化但
onload()尚未完成(addTab尚未执行),则customModelType匹配失败,tab 被删除。预期行为
启动恢复阶段不应自动删除插件的自定义页签,除非该插件已禁用。