Odata 具有多个参数的Fiori主细节应用程序路由
我目前正在开发我的第一个SAP Fiori应用程序。 在SAP WebIDE中,我使用Master Detail从模板创建了一个项目,并将其连接到我的oData服务 如果我运行未经修改的应用程序,除了在详细信息视图上没有加载任何数据外,其他一切都正常,因为oData服务需要两个参数才能获得唯一的记录 现在的问题是,如果我修改应用程序以使用2个参数并导航到详细视图,则详细视图将加载,但甚至不会命中oData服务。(Chrome开发工具中没有$batch请求) manifest.json中的修改Odata 具有多个参数的Fiori主细节应用程序路由,odata,sapui5,sap-fiori,Odata,Sapui5,Sap Fiori,我目前正在开发我的第一个SAP Fiori应用程序。 在SAP WebIDE中,我使用Master Detail从模板创建了一个项目,并将其连接到我的oData服务 如果我运行未经修改的应用程序,除了在详细信息视图上没有加载任何数据外,其他一切都正常,因为oData服务需要两个参数才能获得唯一的记录 现在的问题是,如果我修改应用程序以使用2个参数并导航到详细视图,则详细视图将加载,但甚至不会命中oData服务。(Chrome开发工具中没有$batch请求) manifest.json中的修改
{
"pattern": "JOBSSet/{Jobname}/{Jobcount}",
"name": "object",
"target": [
"master",
"object"
]
}
主控制器的修改:
_showDetail : function (oItem) {
var bReplace = !Device.system.phone;
// set the layout property of FCL control to show two columns
this.getModel("appView").setProperty("/layout", "TwoColumnsMidExpanded");
this.getRouter().navTo("object", {
Jobname : encodeURIComponent(oItem.getBindingContext().getProperty("Jobname")),
Jobcount : oItem.getBindingContext().getProperty("Jobcount")
}, bReplace);
}
_onObjectMatched : function (oEvent) {
var sJobname = decodeURIComponent(oEvent.getParameter("arguments").Jobname);
var sJobcount = oEvent.getParameter("arguments").Jobcount;
this.getModel("appView").setProperty("/layout", "TwoColumnsMidExpanded");
this.getModel().metadataLoaded().then( function() {
var sObjectPath = this.getModel().createKey("JOBSSet", {
Jobname : sJobname,
Jobcount : sJobcount
});
this._bindView("/" + sObjectPath);
}.bind(this));
}
详细控制器的修改:
_showDetail : function (oItem) {
var bReplace = !Device.system.phone;
// set the layout property of FCL control to show two columns
this.getModel("appView").setProperty("/layout", "TwoColumnsMidExpanded");
this.getRouter().navTo("object", {
Jobname : encodeURIComponent(oItem.getBindingContext().getProperty("Jobname")),
Jobcount : oItem.getBindingContext().getProperty("Jobcount")
}, bReplace);
}
_onObjectMatched : function (oEvent) {
var sJobname = decodeURIComponent(oEvent.getParameter("arguments").Jobname);
var sJobcount = oEvent.getParameter("arguments").Jobcount;
this.getModel("appView").setProperty("/layout", "TwoColumnsMidExpanded");
this.getModel().metadataLoaded().then( function() {
var sObjectPath = this.getModel().createKey("JOBSSet", {
Jobname : sJobname,
Jobcount : sJobcount
});
this._bindView("/" + sObjectPath);
}.bind(this));
}
只有从应用程序的第一页开始运行应用程序时,才会发生此行为 例如,如果您在智能手机上测试应用程序(或使用Chrome Dev工具进行模拟),您将看到,当应用程序直接打开到详细信息页面时,将有一个网络调用来获取项目详细信息。它也将是一个$batch调用,但在它里面你会找到一个'GET/JOBSSet(Jobname='x',Jobcount='y') 基本上是这样的:默认情况下,UI5将数据缓存在
Context
对象中(假设您使用的是v2.ODataModel
类)。当您运行应用程序并看到“作业”列表时,库已经为从oData服务返回的每条记录创建了一个上下文对象
如果稍后在应用程序中创建上下文对象(直接或间接,如
bindElement
方法),UI5将检查给定路径-/JOBSSet(Jobname='x',Jobcount='y')
。如果已经有与该路径链接的上下文,那么该上下文应该已经存在于主内存中。因此,不需要额外的调用。此行为仅在从应用程序的第一页开始运行应用程序时发生
例如,如果您在智能手机上测试应用程序(或使用Chrome Dev工具进行模拟),您将看到,当应用程序直接打开到详细信息页面时,将有一个网络调用来获取项目详细信息。它也将是一个$batch调用,但在它里面你会找到一个'GET/JOBSSet(Jobname='x',Jobcount='y')
基本上是这样的:默认情况下,UI5将数据缓存在Context
对象中(假设您使用的是v2.ODataModel
类)。当您运行应用程序并看到“作业”列表时,库已经为从oData服务返回的每条记录创建了一个上下文对象
如果稍后在应用程序中创建上下文对象(直接或间接,如
bindElement
方法),UI5将检查给定路径-/JOBSSet(Jobname='x',Jobcount='y')
。如果已经有与该路径链接的上下文,那么该上下文应该已经存在于主内存中。因此,不需要额外的呼叫。但如果我单击作业,则不会加载任何详细信息。它仅显示包含作业集数据的详细视图,但不获取详细信息。只传递一个参数,它尝试获取详细信息,但由于缺少参数而失败。所以问题是,为什么它在传递1个参数时获取细节,而在传递2个参数时甚至不尝试获取细节Chrome开发工具的控制台/网络部分没有错误?此外,我建议您尝试调用/JOBSSet(Jobname='x',Jobcount='y')和/JOBSSet(Jobname='x',Jobcount='y'))/要查看网关客户端或浏览器中的详细信息以检查它们是否正常工作:-)开发工具中没有错误,只是没有命中oData服务。如果我打开一个带有指向我的oData的url的选项卡,并附加/JOBSSet(Jobname='x',Jobcount='y'),它会在发现问题时加载预期的作业详细信息!我只有一个实体和getEntitySet和GetEntity。将GetEntity的结果移动到它自己的实体可以修复它。我猜这是一个缓存问题,但如果我点击一个作业,就不会加载任何详细信息。它仅显示包含作业集数据的详细视图,但不获取详细信息。只传递一个参数,它尝试获取详细信息,但由于缺少参数而失败。所以问题是,为什么它在传递1个参数时获取细节,而在传递2个参数时甚至不尝试获取细节Chrome开发工具的控制台/网络部分没有错误?此外,我建议您尝试调用/JOBSSet(Jobname='x',Jobcount='y')和/JOBSSet(Jobname='x',Jobcount='y'))/要查看网关客户端或浏览器中的详细信息以检查它们是否正常工作:-)开发工具中没有错误,只是没有命中oData服务。如果我打开一个带有指向我的oData的url的选项卡,并附加/JOBSSet(Jobname='x',Jobcount='y'),它会在发现问题时加载预期的作业详细信息!我只有一个实体和getEntitySet和GetEntity。将GetEntity的结果移动到它自己的实体可以修复它。所以我想这是一个缓存问题