列表绑定未针对 /JSONDataSet 的列表进行绑定

List Binding is not bound against a list for /JSONDataSet

我有一个 JSON 模型,它是我从元数据集构建的。

所以我创建了 JSON 数组并执行了以下操作:

var oModel = new JSONModel({
  JSONDataSet: oJSONDataArray
});
this._oFragment.setModel(oModel);

在我的片段中,我有一个 table:

<Table id="tableId" items="{ path:'/JSONDataSet' }">
  <columns>
    <Column>
      <Text text="HeaderColumn1"/>
    </Column>
    <!-- ... -->
  </columns>
  <ColumnListItem>
    <Text text="{Value1}"/>
    <!-- ... -->
  </ColumnListItem>
</Table>

现在我的片段一切正常。在我的列表中,我会看到来自我的 JSON 模型的所有数据,但我的控制台中仍然收到这个奇怪的错误:

List Binding is not bound against a list for /JSONDataSet

我该如何解决这个问题?

如果您看一下浏览器控制台,您可能已经收到一条错误消息,告诉您 "the template or factory function was not provided" 或类似的内容。

下面的代码,少了点东西

<Table id="tableId" items="{ path:'/JSONDataSet' }">
        <columns>
          .....
        <columns>
</Table>

如果您这样做 items="{ path:'/JSONDataSet' }",则意味着您希望根据模型中的路径 /JSONDataSet 动态创建列表中的项目。此路径应指向某种数组(通常是对象数组)。使用 UI5 术语,您正在尝试使用 aggregation binding.

但是,您希望如何创建 Table 中的项目?

这就是为什么您需要提供一个模板项,在您的 table:

中声明一个示例项
<Table id="tableId" items="{ path:'/JSONDataSet' }">
        <columns>
          .....
        <columns>
        <items>
            <ColumnListItem>
                <cells>
                    <ObjectIdentifier
                        title="{a}"
                        text="{b}"/>
                    <Text
                        text="{c}" />
                </cells>
            </ColumnListItem>
         </items>
</Table>

UI5 documentation 中查看更多示例。

在上面的代码中,abc 是数组中每个对象的属性。

最后,如果您的数组包含 10 个项目,将在您的 table 中创建 10 行。如果您想动态创建列,只需提供一个列示例并改用 columns="{ path:'/JSONDataSet'}

List Binding is not bound against a list for ...

以上error occurs only in ODataListBinding.js and is thrown when the module fails to find the entityset name within the service $metadata document or if the resulting multiplicity is not "*". source


在您的情况下,框架假定 JSONDataSet 是 $metadata 中定义的某个实体集名称,显然无法找到。为了防止框架在 $metadata 中搜索它,您需要告诉 JSONDataSet 而不是 来自未命名的默认模型 (ODataModel),而是来自另一个模型 ( JSONModel).

尝试给它起一个名字,并在绑定定义中分配这样的名字:

const oModel = new JSONModel({
  JSONDataSet: /*some data*/
});
this._oFragment.setModel(oModel, "anotherModel");
<Table id="tableId" items="{anotherModel>/JSONDataSet}">
  <!-- ... -->
  <ColumnListItem>
    <Text text="{anotherModel>Value1}"/>
    <!-- ... -->
  </ColumnListItem>
</Table>

框架不会尝试解析 anotherModel>/JSONDataSet,直到该模型被注册并设置为片段。错误将消失,因为框架现在知道它不是在初始化 ODataListBinding,而是在初始化客户端 ListBinding。