如何将键字段作为变量而不是硬编码键值传递给 OData 操作?
How to pass a key field as variable instead of hard-coded key value to OData operation?
我正在从 SAP UI5 视图控制器调用 GetEntity OData read
方法并在请求中传递一个键值 URL。当我对键值进行硬编码时,我从后端得到了正确的响应。
但是,当我尝试通过将键值附加到 URL 来在变量中动态传递键值时,它不起作用。我收到以下错误
HTTP request failed 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");
}
});
您应该将变量连接到字符串的其余部分,如下所示:
oMod.read("/GrantMasterSet('" + sGrant + "')", {
或者,您可以使用模板文字,它归结为同一件事(注意反义词):
oMod.read(`/GrantMasterSet('${sGrant}')`, {
您应该转义 '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,无论你的实体类型的键的数据类型是什么。
方法是createKey
的sap.ui.model.odata.v2.ODataModel
class。参见 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
来实现。
我正在从 SAP UI5 视图控制器调用 GetEntity OData read
方法并在请求中传递一个键值 URL。当我对键值进行硬编码时,我从后端得到了正确的响应。
但是,当我尝试通过将键值附加到 URL 来在变量中动态传递键值时,它不起作用。我收到以下错误
HTTP request failed 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");
}
});
您应该将变量连接到字符串的其余部分,如下所示:
oMod.read("/GrantMasterSet('" + sGrant + "')", {
或者,您可以使用模板文字,它归结为同一件事(注意反义词):
oMod.read(`/GrantMasterSet('${sGrant}')`, {
您应该转义 '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,无论你的实体类型的键的数据类型是什么。
方法是createKey
的sap.ui.model.odata.v2.ODataModel
class。参见 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
来实现。