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

时间:2019-03-29 14:37:22

标签: sapui5

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

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

  

HTTP请求失败404

在下面的代码中,sGrant是变量,它不起作用。但是,如果我用以下代码中的硬编码值替换了变量名称,例如,在像这样的读取方法"/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");
  }
});

3 个答案:

答案 0 :(得分:3)

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

该方法是createKey类的sap.ui.model.odata.v2.ODataModel。参见its documentation

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

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

}

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

答案 1 :(得分:0)

您应将变量连接到字符串的其余部分,如下所示:

oMod.read("/GrantMasterSet('" + sGrant + "')", {

或者,您可以使用模板文字,该文字可以归结为同一件事(注意背景知识):

oMod.read(`/GrantMasterSet('${sGrant}')`, {

答案 2 :(得分:-1)

您应转义'sGrant'以便对其进行评估。

应该是这样的:

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