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

Sapui5 如何将键字段作为变量而不是硬编码的键值传递给OData操作?,sapui5,Sapui5,我正在从SAP UI5视图控制器调用GetEntity ODataread方法,并在请求URL中传递一个键值。当我硬编码键值时,我从后端得到了正确的响应 但是,当我试图通过将键值附加到URL来在变量中动态传递键值时,它就不起作用了。我得到以下错误 HTTP请求失败404 在下面的代码中,sGrant是变量,它不起作用。但是如果我用下面代码中硬编码的值替换变量名,例如,在像这样的read方法中:“/GrantMasterSet('TY560003')”,那么它可以工作: var sGrant=th

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

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

HTTP请求失败404

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

var sGrant=this.byId(“grantNbr”).getValue();
var oMod=this.getOwnerComponent().getModel();
oMod.read(“/GrantMasterSet('sGrant')”{
成功:功能(oData){
var oJsonModel=newjsonmodel();
oJsonModel.setData(oData);
this.getView().setModel(oJsonModel);
}.绑定(此),
错误:函数(oError){
MessageToast.show(“读取失败”);
}
});

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

oMod.read("/GrantMasterSet('" + sGrant + "')", {
或者,您可以使用一个模板文字,这可以归结为同一件事(请注意backtics):


您应该转义“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");
    }
});

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

方法是
sap.ui.model.odata.v2.ODataModel
类的
createKey
。看

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

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)根据密钥类型,URI必须采用不同的格式。例如,当键是GUID时,如果键完全不同,则该键将被忽略。如果它是一个整数,就不会有单引号。2) IE 11中不支持模板文本。请参阅可能的副本
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)
    );

}