如何在 JSON 模型中获取单个 JSON 对象?
How to get a single JSON object in JSON Model?
我在manifest.json中定义了一个默认模型:
"dataSources": {
"mainService": {
"uri": "/.../vehicleCollection",
"type": "JSON"
}
},
然后通过以下方式获得 sap.ui.model.json.JSONModel:
var model = oView.getModel();
var oObject = model.getJSON("/VEHICLES(0001)");
我想要的是vehicleId为0001的VEHICLES,相反,它返回了字符串中的整个VEHICLES数组:
oObject = "{"VEHICLES":[{"vehicleId":"0001","route":...} {"vehicleId":"0005","route":...} ..."
我想知道有没有方便的方法来获取单个数据对象?我正在尝试将此数据绑定到主从模板中的详细信息页面。
参考:https://sapui5.netweaver.ondemand.com/#docs/api/symbols/sap.ui.model.json.JSONModel.html
====更新====
JSON结构
(model.oData
的结果和数据来自 "/.../vehicleCollection",
):
{"VEHICLES":[
{
"vehicleId":"0001",
"route":"..",
...
},
{ "vehicleId":"0005",
"route: "..",
...
}]
}
====更新=====
我想分享一下我的解决方法(放在这里可以吗?),我承认它很丑,所以我希望使用 UI5 让它更优雅 API.
Master.controller.js
_showDetail : function (oItem) {
var bReplace = !Device.system.phone;
this.getRouter().navTo("object", {
objectId : oItem.getBindingContext().getProperty("vehicleId")
}, bReplace);
},
Detail.controller.js
_onBindingChange : function () {
var oView = this.getView(),
oElementBinding = oView.getElementBinding(),
oViewModel = this.getModel("detailView"),
sPath = oElementBinding.getPath(),
oResourceBundle = this.getResourceBundle(),
ObjectId = sPath.match(/'(.*?)'/)[1],
var JSONObject = oView.getModel().getJSON();
JSONObject = JSON.parse(JSONObject);
function getObjects(obj, key, val) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
objects = objects.concat(getObjects(obj[i], key, val));
} else if (i == key && obj[key] == val) {
objects.push(obj);
}
}
return objects;
}
var oneVehicle = getObjects(JSONObject, "vehicleId", ObjectId);
oViewModel.setProperty("/route", oneVehicle[0]['route']);
},
Detail.view.xml
<ObjectStatus text="{detailView>/route}"/>
model.getData()
会给你对象。一旦你得到了对象,你就可以使用键,即 model.getData().VEHICLES
,它会给你现在的数组值来访问第三个元素 model.getData().VEHICLES[3]
.
所以你的答案是:
model.getData().VEHICLES[3].vehicleId ;
注意: 这是您的 json 的一些假设,但如果可以做到 console.log(model.getData( )) 或放置 JSON.stringify(model.getData()) 将您的 json 结构粘贴到问题中,让我们知道您想要访问哪个特定元素会很容易。
建议的解决方案有效,但它不包含最佳实践,我强烈建议不要开始这样的编码。您应该始终使用 getProperty
来访问模型数据。在您的示例中,您可以像这样访问 vehicleId:
var vehicleId = model.getProperty("/VEHICLES/3/vehicleId");
如需整车使用:
var vehicle = model.getProperty("/VEHICLES/3");
我在manifest.json中定义了一个默认模型:
"dataSources": {
"mainService": {
"uri": "/.../vehicleCollection",
"type": "JSON"
}
},
然后通过以下方式获得 sap.ui.model.json.JSONModel:
var model = oView.getModel();
var oObject = model.getJSON("/VEHICLES(0001)");
我想要的是vehicleId为0001的VEHICLES,相反,它返回了字符串中的整个VEHICLES数组:
oObject = "{"VEHICLES":[{"vehicleId":"0001","route":...} {"vehicleId":"0005","route":...} ..."
我想知道有没有方便的方法来获取单个数据对象?我正在尝试将此数据绑定到主从模板中的详细信息页面。
参考:https://sapui5.netweaver.ondemand.com/#docs/api/symbols/sap.ui.model.json.JSONModel.html
====更新====
JSON结构
(model.oData
的结果和数据来自 "/.../vehicleCollection",
):
{"VEHICLES":[
{
"vehicleId":"0001",
"route":"..",
...
},
{ "vehicleId":"0005",
"route: "..",
...
}]
}
====更新=====
我想分享一下我的解决方法(放在这里可以吗?),我承认它很丑,所以我希望使用 UI5 让它更优雅 API.
Master.controller.js
_showDetail : function (oItem) {
var bReplace = !Device.system.phone;
this.getRouter().navTo("object", {
objectId : oItem.getBindingContext().getProperty("vehicleId")
}, bReplace);
},
Detail.controller.js
_onBindingChange : function () {
var oView = this.getView(),
oElementBinding = oView.getElementBinding(),
oViewModel = this.getModel("detailView"),
sPath = oElementBinding.getPath(),
oResourceBundle = this.getResourceBundle(),
ObjectId = sPath.match(/'(.*?)'/)[1],
var JSONObject = oView.getModel().getJSON();
JSONObject = JSON.parse(JSONObject);
function getObjects(obj, key, val) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
objects = objects.concat(getObjects(obj[i], key, val));
} else if (i == key && obj[key] == val) {
objects.push(obj);
}
}
return objects;
}
var oneVehicle = getObjects(JSONObject, "vehicleId", ObjectId);
oViewModel.setProperty("/route", oneVehicle[0]['route']);
},
Detail.view.xml
<ObjectStatus text="{detailView>/route}"/>
model.getData()
会给你对象。一旦你得到了对象,你就可以使用键,即 model.getData().VEHICLES
,它会给你现在的数组值来访问第三个元素 model.getData().VEHICLES[3]
.
所以你的答案是:
model.getData().VEHICLES[3].vehicleId ;
注意: 这是您的 json 的一些假设,但如果可以做到 console.log(model.getData( )) 或放置 JSON.stringify(model.getData()) 将您的 json 结构粘贴到问题中,让我们知道您想要访问哪个特定元素会很容易。
建议的解决方案有效,但它不包含最佳实践,我强烈建议不要开始这样的编码。您应该始终使用 getProperty
来访问模型数据。在您的示例中,您可以像这样访问 vehicleId:
var vehicleId = model.getProperty("/VEHICLES/3/vehicleId");
如需整车使用:
var vehicle = model.getProperty("/VEHICLES/3");