为什么要用 `FragmentDefinition` 包装一个 `Dialog`?
Why to wrap a `Dialog` with `FragmentDefinition`?
UI5对话框可以直接定义为Dialog
:
<Dialog
xmlns = "sap.m"
id = "helloDialog"
title = "Hello {/recipient/name}">
<beginButton>
<Button
text = "{i18n>dialogCloseButtonText}"
press = ".onCloseDialog" />
</beginButton>
</Dialog>
或者可以用 FragmentDefinition
:
包裹
<core:FragmentDefinition
xmlns:core = "sap.ui.core"
xmlns = "sap.m">
<Dialog
id = "helloDialog"
title = "Hello {/recipient/name}">
<beginButton>
<Button
text = "{i18n>dialogCloseButtonText}"
press = ".onCloseDialog" />
</beginButton>
</Dialog>
</core:FragmentDefinition>
据我了解,FragmentDefinition
提供了更高程度的重用,因为它不依赖于任何视图的控制器,但可以使用 sap.ui.core.Fragment.load()
使用自定义控制器进行初始化:
this._oDialog = await Fragment.load({
controller: fragmentController,
id: oView.getId(),
name: "webapp.view.MyDialog"
});
然而,根据 documentation,从 UI5 1.93 开始,loadFragment()
功能在扩展 sap.ui.core.mvc.Controller
的每个控制器实例上可用,并且 API 有几个优点通用 sap.ui.core.Fragment.load()
函数。
如果我使用 loadFragment()
,我还应该用 FragmentDefinition
包裹 Dialog
吗?我已经尝试了这两种实现,它们都有效并且我在视图上看到了一个对话框,那么如果我仍然可以直接调用 Dialog
和 loadFragment()
,那么使用 FragmentDefinition
有什么好处?
<core:FragmentDefinition>
是一个运行时工件,不是 DOM 的一部分,但仅用于 包装多个 XML 根节点 在 *.fragment.xml
文档中。即:
具有多个根节点的片段
来自topic "Fragments with Multiple Root Nodes"
<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core"> <!--mandatory-->
<Label text="..." />
<Input />
<Button text="..." />
</core:FragmentDefinition>
As XML documents need to have exactly one root node, to achieve XML fragments with multiple root nodes, an additional <FragmentDefinition>
tag needs to be added as root element.
具有单个根节点的片段
<!-- No need to wrap this single root node with <FragmentDefinition> -->
<ActionSheet id="actionSheet"
xmlns="sap.m"
xmlns:core="sap.ui.core"
core:require="{ MessageToast: 'sap/m/MessageToast' }"
title="Choose Your Action"
showCancelButton="true"
placement="Bottom">
<Button
text="Accept"
icon="sap-icon://accept"
press="MessageToast.show('Selected action is ' + ${$source>/text})" />
<!-- ... -->
<Button
text="Other"
press="MessageToast.show('Selected action is ' + ${$source>/text})"
/>
</ActionSheet>
因此,<Dialog>
片段也完全没有必要使用 <core:FragmentDefinition>
。
备注
- 以上仅适用于 XML 个片段。例如 JS 片段不需要
FragmentDefinition
。 FragmentDefinition
甚至不是您需要的模块。
- 片段是否是通过
this.loadFragment
、Fragment.load()
、...等创建并不重要。 <FragmentDefinition>
只对片段的定义起作用。
UI5对话框可以直接定义为Dialog
:
<Dialog
xmlns = "sap.m"
id = "helloDialog"
title = "Hello {/recipient/name}">
<beginButton>
<Button
text = "{i18n>dialogCloseButtonText}"
press = ".onCloseDialog" />
</beginButton>
</Dialog>
或者可以用 FragmentDefinition
:
<core:FragmentDefinition
xmlns:core = "sap.ui.core"
xmlns = "sap.m">
<Dialog
id = "helloDialog"
title = "Hello {/recipient/name}">
<beginButton>
<Button
text = "{i18n>dialogCloseButtonText}"
press = ".onCloseDialog" />
</beginButton>
</Dialog>
</core:FragmentDefinition>
据我了解,FragmentDefinition
提供了更高程度的重用,因为它不依赖于任何视图的控制器,但可以使用 sap.ui.core.Fragment.load()
使用自定义控制器进行初始化:
this._oDialog = await Fragment.load({
controller: fragmentController,
id: oView.getId(),
name: "webapp.view.MyDialog"
});
然而,根据 documentation,从 UI5 1.93 开始,loadFragment()
功能在扩展 sap.ui.core.mvc.Controller
的每个控制器实例上可用,并且 API 有几个优点通用 sap.ui.core.Fragment.load()
函数。
如果我使用 loadFragment()
,我还应该用 FragmentDefinition
包裹 Dialog
吗?我已经尝试了这两种实现,它们都有效并且我在视图上看到了一个对话框,那么如果我仍然可以直接调用 Dialog
和 loadFragment()
,那么使用 FragmentDefinition
有什么好处?
<core:FragmentDefinition>
是一个运行时工件,不是 DOM 的一部分,但仅用于 包装多个 XML 根节点 在 *.fragment.xml
文档中。即:
具有多个根节点的片段
来自topic "Fragments with Multiple Root Nodes"
<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core"> <!--mandatory-->
<Label text="..." />
<Input />
<Button text="..." />
</core:FragmentDefinition>
As XML documents need to have exactly one root node, to achieve XML fragments with multiple root nodes, an additional
<FragmentDefinition>
tag needs to be added as root element.
具有单个根节点的片段
<!-- No need to wrap this single root node with <FragmentDefinition> -->
<ActionSheet id="actionSheet"
xmlns="sap.m"
xmlns:core="sap.ui.core"
core:require="{ MessageToast: 'sap/m/MessageToast' }"
title="Choose Your Action"
showCancelButton="true"
placement="Bottom">
<Button
text="Accept"
icon="sap-icon://accept"
press="MessageToast.show('Selected action is ' + ${$source>/text})" />
<!-- ... -->
<Button
text="Other"
press="MessageToast.show('Selected action is ' + ${$source>/text})"
/>
</ActionSheet>
因此,<Dialog>
片段也完全没有必要使用 <core:FragmentDefinition>
。
备注
- 以上仅适用于 XML 个片段。例如 JS 片段不需要
FragmentDefinition
。FragmentDefinition
甚至不是您需要的模块。 - 片段是否是通过
this.loadFragment
、Fragment.load()
、...等创建并不重要。<FragmentDefinition>
只对片段的定义起作用。