J'appelle la méthode GetEntity OData read
à partir du contrôleur de vue SAP UI5 et je transmets une valeur de clé dans l'URL de la requête. J'obtiens la bonne réponse du back-end lorsque je code en dur la valeur de la clé.
Cependant, lorsque j'essaie de transmettre dynamiquement la valeur de la clé dans une variable en l'ajoutant à l'URL, cela ne fonctionne pas. J'obtiens l'erreur suivante
La requête HTTP a échoué 404
Dans le code ci-dessous, sGrant
est la variable et cela ne fonctionne pas. Mais si je remplace le nom de la variable par sa valeur codée en dur dans le code ci-dessous, par exemple, dans la méthode de lecture comme celle-ci: "/ GrantMasterSet ('TY560003')"
, alors cela fonctionne: p>
var sGrant = this.byId("grantNbr").getValue(); var oMod = this.getOwnerComponent().getModel(); oMod.read("/GrantMasterSet('sGrant')", { success: function(oData) { var oJsonModel = new JSONModel(); oJsonModel.setData(oData); this.getView().setModel(oJsonModel); }.bind(this), error: function(oError) { MessageToast.show("Read Failed"); } });
3 Réponses :
Vous devez concaténer la variable avec le reste de la chaîne, comme ceci:
oMod.read(`/GrantMasterSet('${sGrant}')`, {
Ou, vous pouvez utiliser un modèle littéral, qui revient au même (notez les backtics) :
oMod.read("/GrantMasterSet('" + sGrant + "')", {
Bien que cela soit correct, il présente les inconvénients suivants: 1) Selon votre type de clé, l'URI doit suivre un format différent. Par exemple, lorsque la clé est un GUID, la clé est totalement différente. Si c'est un entier, vous n'aurez pas de guillemets simples. 2) Les littéraux de modèle ne sont pas pris en charge dans IE 11. Voir caniuse.com/#feat=template-literals
Vous devriez échapper à 'sGrant' pour qu'il puisse être évalué.
Cela devrait être quelque chose comme ça:
var sGrant = this.byId("grantNbr").getValue(); var oMod = this.getOwnerComponent().getModel(); oMod.read("/GrantMasterSet("+sGrant+")", { success: function(oData) { var oJsonModel = new sap.ui.model.json.JSONModel(); oJsonModel.setData(oData); this.getView().setModel(oJsonModel); }.bind(this), error: function(oError) { MessageToast.show("Read Failed"); } });
UI5 a une méthode pour générer le bon URI pour vous, quel que soit le type de données de la clé de votre type d'entité.
La méthode est createKey
du sap Classe .ui.model.odata.v2.ODataModel
. Consultez sa documentation
Dans votre contrôleur, utilisez le code source suivant.
onInit: function () { var oRouter = this.getOwnerComponent().getRouter(); oRouter.getRoute("routeName").attachPatternMatched( this.onPatternMatched , this ); }, onPatternMatched: function(oEvent){ var oParameters = oEvent.getParameters(); var oArguments = oParameters.arguments; // is not a function - without () var sKey = oArguments.id; // route parameter passed when using navTo var oDataModel = this.getView().getModel(); // v2.ODataModel oDataModel.metadataLoaded().then(function() { var sPath = oDataModel.createKey("EntitySet", { Key: sKey }); this.getView().bindElement("/" + sPath); }.bind(this) ); }
Cela est généralement nécessaire dans les pages de détails, afin d'appliquer la liaison d'élément à une page. Comme la méthode createKey
repose sur les $ metadata
de votre service, vous devez vous assurer qu'elle est déjà chargée dans votre application. Cela peut être réalisé en utilisant la méthode metadataLoaded
, également fournie dans l'extrait de code.
Double possible de Comment créer dynamiquement un chemin d'entité dans UI5?