如何将键字段作为变量而不是硬编码键值传递给 OData 操作?

gok*_*sj3 1 sapui5

read从 SAP UI5 视图控制器调用 GetEntity OData 方法并在请求 URL 中传递键值。当我对键值进行硬编码时,我从后端得到了正确的响应。

但是,当我尝试通过将键值附加到 URL 来动态传递变量中的键值时,它不起作用。我收到以下错误

HTTP请求失败404

在下面的代码中,sGrant是变量,它不起作用。但是,如果我用下面代码中硬编码的值替换变量名称,例如,在这样的 read 方法中:"/GrantMasterSet('TY560003')",那么它可以工作:

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");
  }
});
Run Code Online (Sandbox Code Playgroud)

fab*_*oti 5

UI5 有一种方法可以为您生成正确的 URI,无论您的实体类型的键的数据类型是什么。

该方法是createKey类的sap.ui.model.odata.v2.ODataModel。查看它的文档

在您的控制器内,使用以下源代码。

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

}
Run Code Online (Sandbox Code Playgroud)

通常,这在详细信息页面中是必需的,以便将元素绑定应用到页面。由于该createKey方法依赖于$metadata您的服务,因此您必须确保它已加载到您的应用程序中。metadataLoaded这可以通过使用代码片段中提供的方法来实现。