如何多次创建视图并使用独立的控制器实例?
问题解答
为什么控制器会被复用?
UI5 默认会对同一个视图定义对应的控制器类创建单例实例——也就是说,第一次创建视图时初始化控制器,后续再创建同类型视图时,会直接复用这个已存在的控制器实例,所以控制器里的变量状态会被所有同类型磁贴共享。
能不能实例化新的控制器?
当然可以!你可以在创建 XML 视图时,手动传入新的控制器实例,而不是依赖视图定义中绑定的默认控制器。示例代码如下:
sap.ui.define([ "com/sap/tiles/" + selectedTile + "/" + selectedTile + "Controller" ], function(ControllerClass) { // 每次创建视图时,实例化一个全新的控制器对象 const newControllerInstance = new ControllerClass(); const tileView = sap.ui.xmlview({ viewName: "com.sap.tiles." + selectedTile + "." + selectedTile, controller: newControllerInstance // 绑定新的控制器实例 }); return tileView; });
这样每个磁贴视图都会拥有独立的控制器,变量状态也不会互相干扰。
关于改用组件或片段的说法是否正确?
这个说法不完全准确:
- 组件(Component)确实是更推荐的方案:组件拥有独立的生命周期、资源管理和配置空间,非常适合封装可复用的复杂部件(比如你的磁贴),后续维护和扩展起来更清晰。
- 片段(Fragment)更适合复用无独立逻辑的纯UI结构,因为片段本身没有控制器,如果你的磁贴需要独立的业务逻辑,单独用片段可能满足不了需求,还是需要搭配独立控制器或者直接用组件。
- 并不是说“同一窗口多次使用同一视图+不同控制器”完全不可行,只是组件的架构更符合UI5的最佳实践,尤其当磁贴的复杂度提升后优势更明显。
很高兴你已经通过排查代码中的错误函数调用解决了问题,Boghyon Hoffmann的建议帮你找到了方向~
内容的提问来源于stack exchange,提问作者ClFi335114
相关产品推荐
相关产品推荐

