SimpleForm 上的 SAPUI5 数据绑定
SAPUI5 Data Binding on SimpleForm
我在尝试将数据绑定到简单表单时遇到问题。我正在使用模拟服务器并已成功将数据绑定到 list/table
我的manifest.json看起来像这样
"mock": {
"dataSource": "mainService"
}
我的模拟数据(UserDetailsSet.json)看起来像这样
[{
"ID_PassNum": "cu001",
"Title": "Mr",
"Name": "Don",
"Surname": "Ownery",
"ResType": "SA",
"Country": "South Africa"
}]
我的 SimpleForm 字段如下所示
<Label text="Name" />
<Input value="{mock>/UserDetailsSet/0/Name}" />
<Label text="Surname" />
<Input value="{mock>/UserDetailsSet/0/Surname}"/>
我错过了什么?
绑定应该是这样的
<Label text="Name" />
<Input value="{mock>Name}" />
<Label text="Surname" />
<Input value="{mock>Surname}"/>
如果它在模拟中只有一个对象。如果不起作用,请将控制器代码放在您将模型设置为视图的位置
您似乎在使用 ODataModel
。在 ODataModels 中,针对 collections/aggregations 的绑定并不像使用 JSONModel 那样容易。您不能使用 collection/index/property
语法 access/bind 属性。
ODataModel 如何存储数据
如果您加载像 UserDetailSet
这样的实体集,则存储在 ODataModel 中的数据看起来有点像这样:
{
UserDetailSet('00001'): { ... },
UserDetailSet('00002'): { ... },
UserDetailSet('00003'): { ... },
UserDetailSet('00004'): { ... }
}
而“00001”等是实体键。如果您在 UserDetailSet
上创建聚合绑定,ODataListBinding 将处理将上述数据转换为每个项目的上下文。
属性 绑定到 ODataModel
您的绑定必须如下所示:
<Label text="Name" />
<Input value="{mock>/UserDetailSet('00001')/Name}" />
<Label text="Surname" />
<Input value="{mock>/UserDetailSet('00001')/Surname}"/>
动态 属性 绑定到 ODataModel
或者 - 更动态一点 - 像这样绑定(注意:绑定现在是相对的,没有前导 /
):
<SimpleForm id="MyForm">
<Label text="Name" />
<Input value="{mock>Name}" />
<Label text="Surname" />
<Input value="{mock>Surname}"/>
</SimpleForm>
并在 SimpleForm 本身上动态使用 bindElement
:
this.getView().byId("MyForm").bindElement({
path: "/UserDetailSet('"+ sUserID +"')",
model: "MyOdataModelID",
// use OData parameters here if needed
parameters: {
"expand": "UserAdress"
},
// react on binding events here
events: {
change: function (oEv) { },
dataRequested: function (oEv) { },
dataReceived: function (oEv) {}
}
});
BR
克里斯
我在尝试将数据绑定到简单表单时遇到问题。我正在使用模拟服务器并已成功将数据绑定到 list/table
我的manifest.json看起来像这样
"mock": {
"dataSource": "mainService"
}
我的模拟数据(UserDetailsSet.json)看起来像这样
[{
"ID_PassNum": "cu001",
"Title": "Mr",
"Name": "Don",
"Surname": "Ownery",
"ResType": "SA",
"Country": "South Africa"
}]
我的 SimpleForm 字段如下所示
<Label text="Name" />
<Input value="{mock>/UserDetailsSet/0/Name}" />
<Label text="Surname" />
<Input value="{mock>/UserDetailsSet/0/Surname}"/>
我错过了什么?
绑定应该是这样的
<Label text="Name" />
<Input value="{mock>Name}" />
<Label text="Surname" />
<Input value="{mock>Surname}"/>
如果它在模拟中只有一个对象。如果不起作用,请将控制器代码放在您将模型设置为视图的位置
您似乎在使用 ODataModel
。在 ODataModels 中,针对 collections/aggregations 的绑定并不像使用 JSONModel 那样容易。您不能使用 collection/index/property
语法 access/bind 属性。
ODataModel 如何存储数据
如果您加载像 UserDetailSet
这样的实体集,则存储在 ODataModel 中的数据看起来有点像这样:
{
UserDetailSet('00001'): { ... },
UserDetailSet('00002'): { ... },
UserDetailSet('00003'): { ... },
UserDetailSet('00004'): { ... }
}
而“00001”等是实体键。如果您在 UserDetailSet
上创建聚合绑定,ODataListBinding 将处理将上述数据转换为每个项目的上下文。
属性 绑定到 ODataModel
您的绑定必须如下所示:
<Label text="Name" />
<Input value="{mock>/UserDetailSet('00001')/Name}" />
<Label text="Surname" />
<Input value="{mock>/UserDetailSet('00001')/Surname}"/>
动态 属性 绑定到 ODataModel
或者 - 更动态一点 - 像这样绑定(注意:绑定现在是相对的,没有前导 /
):
<SimpleForm id="MyForm">
<Label text="Name" />
<Input value="{mock>Name}" />
<Label text="Surname" />
<Input value="{mock>Surname}"/>
</SimpleForm>
并在 SimpleForm 本身上动态使用 bindElement
:
this.getView().byId("MyForm").bindElement({
path: "/UserDetailSet('"+ sUserID +"')",
model: "MyOdataModelID",
// use OData parameters here if needed
parameters: {
"expand": "UserAdress"
},
// react on binding events here
events: {
change: function (oEv) { },
dataRequested: function (oEv) { },
dataReceived: function (oEv) {}
}
});
BR 克里斯