列表绑定未针对 /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 中查看更多示例。
在上面的代码中,a
、b
和 c
是数组中每个对象的属性。
最后,如果您的数组包含 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。
我有一个 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 中查看更多示例。
在上面的代码中,a
、b
和 c
是数组中每个对象的属性。
最后,如果您的数组包含 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。