在 SAPUI5 文档中,提到了视图和控制器扩展,并以多种不同的方式扩展它。然而,没有提到Fragment扩展,我遇到了一个标准的Fiori管理促销优惠应用程序,它使用许多Fragment,每个Fragment都有很多标签。这些 EP 被框架忽略了。 应用程序扩展的页面已过时,就像您查看 SAP 注释一样,他们引入的 EP 比本文档中的内容多得多。
调试标准 ExtensionPoint (EP) 类后,我注意到在组件清单自定义中配置什么并不重要,因为这些 EP 会被框架忽略。
我的manifest.json代码尝试调用Fragment EP(我在调试std时确定路径和扩展名:
Component-dbg.js 中视图扩展(而不是片段)的工作示例(观察 _sOwnerId 属性和对 getOwnerIdFor() 的验证调用):
现在的问题是,SAP 是否需要修复他们的代码以确保片段有父级/所有者,以便它将通过上述验证行并因此触发我的扩展? 我已在调试中手动绕过它,并使扩展正常工作。
或者,Fragment 扩展是否根本不受支持并且不应该使用?那么为什么 SAP 会在 Fragment 中添加这么多 EP 呢?或者我错过了一些东西并且没有正确使用 Fragment 扩展?如前所述,我找不到任何相关文档。
TL;DR:如果您可以控制何时和如何创建片段,请参阅下面的链接文档。否则,创建客户事件以通知应用程序开发人员在其代码中提供相应的修复。
有关此问题的最重要文档可以在以下位置找到:所有者组件
框架是否包含扩展实现取决于应用程序如何创建包含扩展点的片段或视图。
正如您在屏幕截图中突出显示的那样,内部
ManagedObject
属性 _sOwnerId
指的是在 Component
实例化过程中已知的“所有者”ManagedObject
实例的 ID。在大多数情况下,所有者组件 ID (_sOwnerId
) 由框架自动分配。
但是,如果应用程序创建“框架管理的功能”
1的
ManagedObject
outside,从框架的角度来看,它是一个简单的类实例化,没有任何 Component
的上下文。通常,当 ManagedObject
创建发生在异步回调函数中或当用户按下启动按需创建 ManagedObject
的 UI 元素时,就会出现这种情况。在这种情况下,应用程序必须提供其应用程序描述符 (manifest.appdescr
) 具有扩展信息的所有者组件的 ID。这是可以做到的,例如:
this.loadFragment
(自 UI5 1.93 起可用),在控制器代码中创建片段时,自动分配所有者 ID。2
ManagedObject
创建within
this.getOwnerComponent().runAsOwner(function () {/* Fragment.load, XMLView.create, etc.*/}.bind(this));
。3
1
和
的API
sap.ui.*fragment
、
Fragment.load
、
sap.ui.*view
或*View.create
外部this.getOwnerComponent().runAsOwner
这就是为什么创建的片段没有分配任何 _sOwnerId
。<core:Fragment fragmentName="..." type="..."/>
也不能分配任何所有者 ID。
在过去(我相信直到 UI5 1.94 左右),由于错误,它曾经在没有上述记录的解决方案的情况下意外地“工作”。 UI5修复了这个bug。尽管 owner 组件 不是一个众所周知的主题,但应用程序应该尽早使用
runAsOwner
API 或迁移到较新的控制器 API loadFragment
,而不是依赖于意外起作用的观察到的行为。
另一个可能的原因是应用程序代码已更改,例如从在控制器的
ManagedObject
处理程序中同步创建 onInit
(框架仍然知道所有者 ID)到在异步回调函数中创建它。
1 请参阅“框架处理什么?”部分在上面的链接文档中。
2 API:
sap.ui.core.mvc.Controller#loadFragment
sap.ui.core.Component#runAsOwner