UI5中Fragment.load与Controller.loadFragment的区别及官方推荐方案
关于Controller.loadFragment与底层sap.ui.core.Fragment.load的差异及官方使用建议
为什么底层实现一致还要额外提供Controller.loadFragment方法
核心是SAP针对控制器场景做了便捷封装,解决原生Fragment.load在控制器中使用时的重复代码和易漏配置问题,主要差异点如下:
- 自动填充必要配置,减少样板代码
直接使用Fragment.load在控制器中加载fragment时,要保证fragment内的事件处理器绑定到当前控制器、正确继承所属视图的模型/组件上下文,需要手动传入controller、ownerId参数,还要提前引入sap/ui/core/Fragment依赖,完整写法如下:
而sap.ui.require(["sap/ui/core/Fragment"], async function(Fragment){ this.myFragment = await Fragment.load({ name: "my.useful.VerySimpleUiPart", controller: this, // 手动绑定当前控制器 ownerId: this.getView().getId() // 手动关联所属视图ID }); }.bind(this));Controller.loadFragment会自动从当前控制器上下文获取上述参数,无需开发者手动传入,也不需要提前引入Fragment依赖,代码精简度大幅提升。 - 自动关联生命周期,避免内存泄漏
原生Fragment.load加载的实例不会自动绑定所属视图的生命周期,需要开发者在视图销毁时手动调用fragment的销毁方法,漏写就会产生内存泄漏。而通过Controller.loadFragment加载的fragment会自动关联当前视图的生命周期,视图销毁时fragment会被自动回收,无需额外手动处理。
SAP官方明确使用建议
所有在控制器(sap.ui.core.mvc.Controller的子类实例)上下文内加载Fragment的场景,优先使用
this.loadFragment方法。仅当加载场景不在控制器上下文(如自定义工具类、全局逻辑等)时,才需要直接调用sap.ui.core.Fragment.load方法。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

