为什么要用 `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 吗?我已经尝试了这两种实现,它们都有效并且我在视图上看到了一个对话框,那么如果我仍然可以直接调用 DialogloadFragment(),那么使用 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.

具有单个根节点的片段

来自sample sap.m.ActionSheet

<!-- 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 片段不需要 FragmentDefinitionFragmentDefinition 甚至不是您需要的模块。
  • 片段是否是通过this.loadFragmentFragment.load()、...等创建并不重要。 <FragmentDefinition>只对片段的定义起作用。