动态绑定项目时"元素聚合项缺少模板或工厂函数"

Pil*_*lle 3 sapui5

我正在尝试绑定sap.m.Table中的项目(阻止使用Factory函数),我收到此错误:

缺少Element的聚合项的模板或工厂函数

我的观点如下:

<Table id="favTable">
  <headerToolbar>
    <Toolbar>
      <Title id="tableHeader" text="{i18n>tableHeader}"/>
    </Toolbar>
  </headerToolbar>
  <columns>
    <Column>
      <Label text="{i18n>serviceNameColText}" />
    </Column>
    <Column>
      <Label text="{i18n>serviceTechNameColText}"/>
    </Column>
    <Column width="50px"/>
  </columns>
  <ColumnListItem>
    <Text text="{Text}" />
    <Text text="{Service}" />
    <Button icon="sap-icon://delete" press="onDeleteRow" />
  </ColumnListItem>
</Table>
Run Code Online (Sandbox Code Playgroud)

根据控制器代码(使用绑定的OData服务)尝试在命中路径后将项绑定到视图中:

_onPatternMatched: function(oEvent) {
  let oTable = this.getView().byId(sIdTable);
  // bind items dynamically with attributes
  const sGroupId = oEvent.getParameter("arguments").Group;
  let sBindingPath = "/DataSet(SetId='" + sSetId + "')"
  oTable.bindItems({
    path: sBindingPath,
    parameters: {
      navigation: {
        FavoriteGroupSet: "ToFavorites"
      }
    },
    filters: [
      // new Filter("InstitutionId", "EQ", oEvent.getParameter("arguments").Institution),
      new Filter("SetId", "EQ", sSetId)
    ]
  })
},
Run Code Online (Sandbox Code Playgroud)

我需要做些什么才能使正确的绑定显示正确的数据?

Ser*_*scu 7

在UI5的聚合绑定概念中,您可以使用两种机制来构建聚合项:

  • 模板元素,从模型集合中为每个单独的项目克隆.
  • 工厂函数,从模型中为每个单独的项调用,并期望为每个调用构建一个新的控件/元素.

我假设您要使用ColumnListItemXML中的XML作为模板.问题是,在构建XML视图时,只有当您还在XML中绑定父聚合时,控件才会用作父聚合的模板.否则,它们被解释为简单的孩子.

简而言之,UI5将您的视图解释为具有sap.m.Table单个静态项目.当您尝试稍后绑定items聚合时,它会销毁此项(实际上,它只会在您的情况下引发错误,因为您在使用bindAggregation方法时必须指定模板或工厂(bindItems这只是此方法的包装器) ).

解决此问题的一个选项是使用相对绑定,然后使用bindElement方法来更改Table的绑定.在你的情况下,你想要做的事情并不是很清楚,因为它sBindingPath似乎有一个值/DataSet(SetId='ABC'),它实际上不会指向一个集合,而是指向一个DataSet实体.

如果您实际更改了OData服务的使用方式并且您有导航(例如路径看起来像/DataSet('ABC')/MyNavigationSet),那么您可以执行以下操作:

视图:

<!-- note that the items binding path should not start with / (to be relative) -->
<Table id="favTable" items={MyNavigationSet}>
    <columns>
        <!-- your columns... -->
    </columns>
    <items>
        <ColumnListItem id="favTableItemTemplate">
            <cells>
                <Text text="{Text}" />
                <Text text="{Service}" />
                <Button icon="sap-icon://delete" press="onDeleteRow" />
            </cells>
        </ColumnListItem>
    </items>
</Table>
Run Code Online (Sandbox Code Playgroud)

控制器:

function(oEvent) {
    // the rest of your code
    this.byId("favTable").bindElement(sBindingPath);
}
Run Code Online (Sandbox Code Playgroud)

与您当前的OData服务一起使用的另一个选项是将模板声明为依赖项,然后将其用于绑定.templateShareable应设置该标志,以便在重新绑定聚合时不销毁模板.

视图:

<Table id="favTable">
    <columns>
        <!-- your columns... -->
    </columns>
    <dependents>
        <ColumnListItem id="favTableItemTemplate">
            <cells>
                <Text text="{Text}" />
                <Text text="{Service}" />
                <Button icon="sap-icon://delete" press="onDeleteRow" />
            </cells>
        </ColumnListItem>
    </dependents>
</Table>
Run Code Online (Sandbox Code Playgroud)

控制器:

function(oEvent) {
    // the rest of your code
    this.byId("favTable").bindItems({
        path: sBindingPath,
        template: this.byId("favTableItemTemplate"),
        templateShareable: true,
        parameters: {
            navigation: {FavoriteGroupSet: "ToFavorites"}
        },
        filters: [new Filter("SetId", "EQ", sSetId)]
    })
}
Run Code Online (Sandbox Code Playgroud)