UI5中调用getRouter().getTargets().display()是否会销毁源视图?
OpenUI5 Target display方法相关问题解答
核心结论
调用oRouter.getTargets().display("%DESIRED_VIEW%")时,触发展示的前一个源视图默认不会被垃圾回收机制自动销毁,该用法未做特殊配置时存在内存泄漏风险。
具体行为说明
- OpenUI5的Target体系默认启用视图缓存逻辑:只要通过display加载过的视图,会默认保存在路由的视图缓存池中,即便切换到其他目标视图,之前的视图实例也不会被销毁,其绑定的事件监听、模型引用、自定义属性都会完整保留,对应内存不会被GC自动释放。
- 调用display展示新目标视图时,默认仅会将新视图渲染到Target配置对应的容器聚合中,替换旧视图的DOM节点,旧视图的JS实例依然存活,你仍可通过路由的视图获取接口拿到该实例,它的
onExit等销毁生命周期钩子不会被触发。
避免内存泄漏的配置方式
- 方式1:在manifest.json对应Target的配置项中显式添加
"clearTarget": true、"clearControlAggregation": true配置,路由展示新目标时会自动销毁容器聚合中之前的视图实例。 - 方式2:如果是临时展示无需复用的视图,在调用display展示新视图后,手动获取不需要的旧视图实例调用
destroy()方法完成销毁,触发内存释放。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

