You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何多次创建视图并使用独立的控制器实例?

问题解答

为什么控制器会被复用?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:25:10