Odata 具有多个参数的Fiori主细节应用程序路由

Odata 具有多个参数的Fiori主细节应用程序路由,odata,sapui5,sap-fiori,Odata,Sapui5,Sap Fiori,我目前正在开发我的第一个SAP Fiori应用程序。 在SAP WebIDE中,我使用Master Detail从模板创建了一个项目,并将其连接到我的oData服务 如果我运行未经修改的应用程序,除了在详细信息视图上没有加载任何数据外,其他一切都正常,因为oData服务需要两个参数才能获得唯一的记录 现在的问题是,如果我修改应用程序以使用2个参数并导航到详细视图,则详细视图将加载,但甚至不会命中oData服务。(Chrome开发工具中没有$batch请求) manifest.json中的修改

我目前正在开发我的第一个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的结果移动到它自己的实体可以修复它。所以我想这是一个缓存问题