Je travaille actuellement sur ma première application SAP Fiori. Dans SAP WebIDE, j'ai créé un projet à partir d'un modèle à l'aide de Master Detail et je l'ai connecté à mon service oData.

Si j'exécute l'application non modifiée, tout fonctionne, sauf qu'aucune donnée n'est chargée sur la vue détaillée, car le service oData s'attend à ce que 2 paramètres obtiennent un enregistrement unique.

Maintenant, le problème est que si je modifie l'application pour utiliser 2 paramètres et accédez à la vue détaillée, la vue détaillée se charge, mais n'atteint même pas le service oData. (Pas de demande de lot $ dans les outils de développement Chrome)

Modifications dans manifest.json

    {
        "pattern": "JOBSSet/{Jobname}/{Jobcount}",
        "name": "object",
        "target": [
        "master",
        "object"
        ]
    }

Modification du contrôleur maître :

    _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);
        }

Modification du contrôleur de détail :

_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));
        }
0
Patrick Heppler 21 févr. 2020 à 19:23

1 réponse

Meilleure réponse

Ce comportement ne se produit que lorsque vous exécutez l'application à partir de sa première page.

Si vous testez par exemple l'application sur un smartphone (ou utilisez Chrome Dev Tools pour simuler cela), vous verrez que lorsque l'application est ouverte directement sur la page de détail, il y aura un appel réseau pour obtenir les détails de l'élément. Ce sera également un appel $batch, mais à l'intérieur, vous trouverez un 'GET /JOBSSet(Jobname='x',Jobcount='y').

Fondamentalement, ce qui se passe est le suivant : par défaut, UI5 met en cache vos données dans des objets Context (en supposant que vous utilisez la classe v2.ODataModel). Lorsque vous exécutez l'application et voyez une liste de « Jobs », la bibliothèque a déjà créé un objet Context pour chaque enregistrement renvoyé par votre service oData.

Si plus tard dans l'application vous créez un objet Context (directement ou indirectement, comme la méthode bindElement), UI5 vérifiera le chemin donné - /JOBSSet(Jobname='x',Jobcount='y'). S'il existe déjà un contexte lié à ce chemin, alors le contexte devrait déjà exister dans la mémoire principale. Ainsi, aucun appel supplémentaire ne devrait être nécessaire.

2
fabiopagoti 21 févr. 2020 à 17:06