您能告诉我如何在 SAPUI5 中的 OData V4 中执行 OData 读取吗?
我可以在 OData V2 中轻松完成此操作,如何使用 oData V4 实现类似的功能?
this_.getOwnerComponent().getModel("myModel").read("/zprojects", {
"async": true,
"success": function (oData) {
console.log(oData);
},
"error": function (oError) {
console.log(oError);
}
});
对我来说,问题是我想在绑定到视图之前对数据进行处理以添加附加值。这是我的 oData V2 完整代码:
this_.getOwnerComponent().getModel("myModel").read("/zprojects", {
"async": true,
"success": function (oData) {
var myArray = [];
var pos;
for (var i = 0; i < oData.results.length; i++) {
pos = myArray.map(function (e) {
return e.ID;
}).indexOf(oData.results[i].PROJECTID);
if (pos === -1) {
myArray.push({
ID: oData.results[i].PROJECTID,
PROJECT_DESC: oData.results[i].PROJECT_DESC
});
}
}
myArray.sort((a, b) => (a.PROJECT_DESC > b.PROJECT_DESC) ? 1 : -1);
myArray.unshift({
ID: "-1",
PROJECT_DESC: "Please select Project ID"
oModel = new sap.ui.model.json.JSONModel(myArray);
sap.ui.core.Fragment.byId("idFragment", "project").setModel(oModel);
},
"error": function (oError) {
console.log(oError);
}
});
来自文档:
OData V4 模型仅支持使用绑定进行数据访问。它不提供对数据的任何直接访问。
您可以通过创建假绑定并监听
dataReceived
事件来解决这个问题,但我宁愿建议使用 jQuery 的 ajax 功能 来请求数据,直到 v4.ODataModel
支持直接访问数据:
$.get({
url: "<your_service_url>/zprojects",
success: function(data) {
// your success logic
},
error: function(error) {
// your error logic
}
});
您可以直接从控制器访问ODATA V4,以以下代码为例。
var oModel2 = this.getOwnerComponent().getModel();
let aFilters = [
new sap.ui.model.Filter("username", sap.ui.model.FilterOperator.EQ, username),
new sap.ui.model.Filter("password", sap.ui.model.FilterOperator.EQ, password)
];
let oBinding = oModel2.bindList("/users");
oBinding.filter(aFilters);
oBinding.requestContexts().then((aContexts) => {
if (aContexts.length > 0) {
aContexts.forEach((oContext) => {
let oUser = oContext.getObject();
console.log("User found:", oUser);
// alert("Welcome, " + oUser.name);
});
// Navigate to the next view if credentials are valid
sessionStorage.setItem("loggedIn", "true");
var oRouter = sap.ui.core.UIComponent.getRouterFor(this);
oRouter.navTo("Routelist_view_01", {
name: username,
pass: password
});
} else {
MessageBox.error("Invalid Username/Password");
}
}).catch((err) => {
console.error("Error fetching data: ", err);
MessageBox.error("An error occurred while fetching data. Please try again.");
});
}