【问题标题】:Fiori Master Detail App routing with mutliple parameters具有多个参数的 Fiori Master Detail App 路由
【发布时间】:2020-02-21 16:23:03
【问题描述】:

我目前正在开发我的第一个 SAP Fiori 应用程序。 在 SAP WebIDE 中,我使用 Master Detail 从模板创建了一个项目,并将其连接到我的 oData 服务。

如果我运行未修改的应用程序,除了没有数据加载到详细信息视图之外,一切正常,因为 oData 服务需要 2 个参数来获得唯一记录。

现在的问题是,如果我修改应用程序以使用 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));
        }

【问题讨论】:

    标签: odata sapui5 sap-fiori


    【解决方案1】:

    仅当您从第一页开始运行应用程序时才会发生此行为。

    例如,如果您在智能手机中测试应用程序(或使用 Chrome 开发工具进行模拟),您会看到当应用程序直接打开到详细信息页面时,将有一个网络调用来获取项目详细信息.这也将是一个 $batch 调用,但在其中你会发现一个 'GET /JOBSSet(Jobname='x',Jobcount='y')。

    基本上会发生以下情况:默认情况下,UI5 将您的数据缓存在Context 对象中(假设您使用的是v2.ODataModel 类)。当您运行应用程序并看到“作业”列表时,库已经为从您的 oData 服务返回的每条记录创建了一个上下文对象。

    如果稍后在应用程序中创建 Context 对象(直接或间接,如 bindElement 方法),UI5 将检查给定路径 - /JOBSSet(Jobname='x',Jobcount='y')。如果已经有一个与该路径链接的上下文,那么该上下文应该已经存在于主存储器中。因此,不需要额外调用。

    【讨论】:

    • 但是如果我点击一个工作,没有详细信息被加载。它仅显示来自 Jobsset 的数据的详细信息视图,但不获取详细信息。仅传递一个参数它会尝试获取详细信息,但由于缺少参数而失败。所以问题是,为什么它在传递 1 个参数时获取详细信息,但在传递 2 个参数时甚至不尝试获取它们
    • Chrome 开发工具的控制台/网络部分没有错误?
    • 另外,我建议您尝试调用 /JOBSSet(Jobname='x',Jobcount='y') 和 /JOBSSet(Jobname='x',Jobcount='y')/ to_Details 在您的网关客户端或浏览器中检查它们是否正常工作:-)
    • 开发工具中没有错误,它只是没有命中 oData 服务。如果我打开一个带有 url 的选项卡到我的 oData 并附加 /JOBSSet(Jobname='x',Jobcount='y') 它会将预期的作业详细信息加载为 XML
    • 发现问题!我只有一个实体和 GetEntiySet 和 GetEntity。将 GetEntity 的结果移动到它自己的 Entity 修复了它。所以我猜这是一个缓存问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2014-02-04
    • 2012-07-09
    • 2017-06-27
    • 2020-11-16
    • 2013-11-29
    • 2013-11-27
    相关资源
    最近更新 更多