我有一个基于元数据集构建的JSON模型。
所以我创建了该JSON数组并执行以下操作:
var oModel = new JSONModel({
JSONDataSet: oJSONDataArray
});
this._oFragment.setModel(oModel);
在我的片段中,有一张桌子:
<Table id="tableId" items="{ path:'/JSONDataSet' }">
<columns>
<Column>
<Text text="HeaderColumn1"/>
</Column>
<!-- ... -->
</columns>
<ColumnListItem>
<Text text="{Value1}"/>
<!-- ... -->
</ColumnListItem>
</Table>
现在,我的片段一切正常。在我的列表中,我将看到JSON模型中的所有数据,但在控制台中仍然收到此奇怪的错误:
列表绑定未绑定到/ JSONDataSet的列表
如何解决此问题?
答案 0 :(得分:1)
列表绑定不与...的列表绑定。
上面的error occurs only in ODataListBinding.js,当模块未能在服务$ metadata文档或中找到实体集名称时抛出,如果结果的多重性不是"*"
,则抛出该异常。 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。
答案 1 :(得分:0)
如果您查看浏览器控制台,可能已经有一个错误,告诉您“未提供模板或工厂功能”或类似的内容。
在下面的代码中,缺少了一些东西
<Table id="tableId" items="{ path:'/JSONDataSet' }">
<columns>
.....
<columns>
</Table>
如果您执行items="{ path:'/JSONDataSet' }"
,则意味着您希望基于模型中的路径/JSONDataSet
动态创建列表中的项目。该路径应指向某种数组(通常是对象数组)。使用UI5术语,您正在尝试使用aggregation binding。
但是,您如何创建表中的项目?
这就是为什么您需要提供一个模板项,在表中声明一个示例项的原因:
<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个项目,则将在表中创建10行。如果要动态创建列,只需提供一个列示例,然后使用columns="{ path:'/JSONDataSet'}
。