Маршрутизация приложения Fiori Master Detail с несколькими параметрами - PullRequest
0 голосов
/ 21 февраля 2020

В настоящее время я работаю над своим первым приложением SAP Fiori. В SAP WebIDE я создал проект из шаблона с использованием Master Detail и подключил его к моей службе oData.

Если я запускаю немодифицированное приложение, все работает, за исключением того, что данные не загружаются в детальном представлении, поскольку служба oData ожидает 2 Параметры для получения уникальной записи.

Теперь проблема в том, что если я изменю приложение, чтобы использовать 2 параметра, и перейду к подробному представлению, подробное представление загрузится, но даже не коснется службы oData. (Нет запроса партии $ в Chrome Dev Tools)

Модификации в манифесте. 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));
        }

1 Ответ

2 голосов
/ 21 февраля 2020

Это происходит только при запуске приложения, начиная с его первой страницы.

Если вы, например, протестируете приложение на смартфоне (или используете Chrome Dev Tools для имитации этого), вы увидите что, когда приложение открыто непосредственно на странице сведений, произойдет сетевой вызов для получения сведений об элементе. Это будет также пакетный вызов $, но внутри него вы найдете 'GET /JOBSSet(Jobname='x',Jobcount='y').

По сути, происходит следующее: По умолчанию UI5 кэширует ваши данные в Context объектах (при условии, что вы используете класс v2.ODataModel). Когда вы запускаете приложение и видите список «Заданий», библиотека уже создала объект Context для каждой записи, возвращаемой из службы oData.

Если позже в приложении вы создадите объект Context (напрямую или косвенно, как метод bindElement) UI5 проверит заданный путь - /JOBSSet(Jobname='x',Jobcount='y'). Если контекст уже связан с этим путем, тогда контекст должен уже существовать в основной памяти. Таким образом, дополнительный вызов не требуется.

...