"缺少Element"的聚合项的模板或工厂函数;动态绑定项目时

时间:2018-03-28 14:06:58

标签: 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>

根据控制器代码(使用绑定的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)
    ]
  })
},

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

1 个答案:

答案 0 :(得分:6)

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

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

我认为您希望使用XML中的ColumnListItem作为模板。问题是,在构建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>

控制器:

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

与您当前的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>

控制器:

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)]
    })
}