错误 "Cannot add direct child without default aggregation defined for control ..."

Error "Cannot add direct child without default aggregation defined for control ..."

我收到错误 "Cannot add direct child without default aggregation defined for control sap.m.Label"。不确定这意味着什么。这是我的片段:

<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core" xmlns:f="sap.f">
    <ResponsivePopover id="popover" title="{Name}" class="sapUiPopupWithPadding" placement="Bottom">
        <beginButton>
            <Button id="submit" text="{i18n>submit}" press="onSubmit" class="sapUiTinyMargin"/>
        </beginButton>
        <content>
            <f:GridContainer>
                <f:layout>
                    <f:GridContainerSettings rowSize="5rem" columnSize="8rem" gap="1rem"/>
                </f:layout>
                <f:layoutS>
                    <f:GridContainerSettings rowSize="5rem" columnSize="10rem" gap="0.5rem"/>
                </f:layoutS>
                <f:layoutXS>
                    <f:GridContainerSettings rowSize="5rem" columnSize="10rem" gap="0.5rem"/>
                </f:layoutXS>
                <Label text="{i18n>req}" required="true">
                    <f:layoutData>
                        <f:GridContainerItemLayoutData columns="3"/>
                    </f:layoutData>
                </Label>
                <Label id="txt" text="{i18n>cat}" required="true">
                    <f:layoutData>
                        <f:GridContainerItemLayoutData columns="3"/>
                    </f:layoutData>
                </Label>
                <RadioButton id="rbtn1" text="{i18n>grq}">
                    <f:layoutData>
                        <f:GridContainerItemLayoutData columns="4"/>
                    </f:layoutData>
                </RadioButton>
                <RadioButton id="rbtn2" text="{i18n>frq}">
                    <f:layoutData>
                        <f:GridContainerItemLayoutData columns="4"/>
                    </f:layoutData>
                </RadioButton>
                <TextArea id="txtarea" value="" placeholder="{i18n>typeq}" growing="true" growingMaxLines="10" width="100%">
                    <f:layoutData>
                        <f:GridContainerItemLayoutData columns="7"/>
                    </f:layoutData>
                </TextArea>
                <Text text="{i18n>note}">
                    <f:layoutData>
                        <f:GridContainerItemLayoutData columns="7"/>
                    </f:layoutData>
                </Text>
            </f:GridContainer>
        </content>
    </ResponsivePopover>
</core:FragmentDefinition>

预期结果是片段将加载而不会出现错误。

sap.m.Label等控件不能直接在sap.f.Gridcontainer内部使用。您需要先将它们放在 <f:items> 中。

来自文档:https://sapui5.netweaver.ondemand.com/sdk#/api/sap.f.GridContainer%23overview

<f:GridContainer>
  <f:layout>
    <f:GridContainerSettings rowSize="5rem" columnSize="5rem" gap="1rem" />
  </f:layout>
  <f:layoutS>
    <f:GridContainerSettings rowSize="4rem" columnSize="4rem" gap="0.5rem" />
  </f:layoutS>
  <f:items>
    <GenericTile header="Sales Fulfillment">
      <layoutData>
        <f:GridContainerItemLayoutData rows="2" columns="2" />
      </layoutData>
    </GenericTile>
    <w:Card manifest="url-to-manifest">
      <w:layoutData>
        <f:GridContainerItemLayoutData rows="6" columns="3" />
      </w:layoutData>
    </w:Card>
    <Panel>
      <layoutData>
        <f:GridContainerItemLayoutData columns="4" />
      </layoutData>
      <Text text="Sales information" />
    </Panel>
  </f:items>
</f:GridContainer>

命名聚合必须与parent标签具有相同的命名空间。

The namespace of the parent control tag and the aggregation tag must be the same. (Source)

对于您的情况,问题出在 <em><SomeSapMControl</em>><<strong>f:</strong>layoutData>.删除 <f:layoutData> 中的 f:,使其与 parent 的(默认)命名空间匹配。

sap.ui.require([
  "sap/ui/core/Core"
], Core => Core.attachInit(() => sap.ui.require([
  "sap/ui/core/Fragment"
], Fragment => Fragment.load({
  definition: `<f:GridContainer xmlns:f="sap.f" xmlns="sap.m">
    <Label text="Label within GridContainer">
      <layoutData>
        <f:GridContainerItemLayoutData columns="3"/>
      </layoutData>
    </Label>
  </f:GridContainer>`
}).then(control => control.placeAt("content")))));
<script id="sap-ui-bootstrap" src="https://ui5.sap.com/resources/sap-ui-core.js"
  data-sap-ui-libs="sap.m,sap.f,sap.ui.layout"
  data-sap-ui-theme="sap_fiori_3"
  data-sap-ui-async="true"
  data-sap-ui-compatversion="edge"
  data-sap-ui-xx-waitfortheme="init"
></script>
<body id="content" class="sapUiBody"></body>


"Cannot add direct child without default aggregation defined for control sap.m.Label". Not sure what this means.

在控件定义中,控件开发人员可以分配默认聚合,以便应用程序开发人员可以添加 children,而无需在 XML 视图定义中显式放置聚合名称。 sap.f.GridContainer 就是一个例子。它的默认聚合是 items.src 因此,您不需要添加 <f:items> 来添加 children(请参阅我上面的代码片段)。

但是,如果控件没有默认聚合并且 child 节点名称与命名聚合的 none 匹配,XML 处理器将抛出上述错误。