如何在新实例化期间为实体创建odata模型

时间:2019-07-07 18:23:06

标签: sapui5

在CRUD中,单击新按钮时,如何根据实体类型创建JSON模型。

这种基于空实体的JSON模型可以从元数据实体类型派生并分配给视图。

我尝试使用Model.onOnMetaDataLoaded来获取实体类型,并使用具有初始值的默认JSON模型。但是虽然我可以在对象中看到实体类型,但是我无法从元数据中获取实体类型。

var oModel = new sap.ui.model.odata.v2.ODataModel(<ServiceURL>);

oModel.attachMetadataLoaded(null, function(){
   var oMetadata = oModel.getServiceMetadata();
   console.log(oMetadata);
   var metaModel = new sap.ui.model.odata.ODataMetaModel(oMetadata);
   metaModel.getEntityType('XXX') // DOES NOT GIVE VALUE 
},null);

metaModel.getEntityType('XXX') // DOES NOT GIVE VALUE

在创建新实体时,是否需要基于实体类型建立JSON模型。我假设这将有助于验证数据类型,而不是手动进行。

1 个答案:

答案 0 :(得分:1)

自从您询问以来,不,我不是用这种方式做的...我使用oData模型的功能来跟踪更改。任何支持绑定上下文的元素都可以这样工作,例如对话框,视图或简单表单。

以最简单的方式,它看起来像:

myView.setBindingContext(this.getModel().createEntry("/MyEntitySet"));

如果您想要更多控制权,例如指定成功和错误处理程序(您可能会这样做),则类似于:

myView.setBindingContext(this.getModel().createEntry("/MyEntitySet", {
  changeSetId: 'myChanges', 
  properties: {
    myField: 'DefaultValue',
    myDate: new Date()
  },
  success: _ =>  myView.setBusy(false),
  error: _ => myView.setBusy(false)
}));

关于您是否需要自行指定字段的问题:不,您不需要,只需将实体中的任何值直接绑定到字段即​​可。如果用户填写它们,它们将出现在创建中使用的对象中。您可以随时使用

检索对象
const filledOutEntityFields = myView.getBindingContext().getObject();

在您看来,您可以像往常一样使用相对绑定:

<Input value="{myField}" />

或者更具体地说明您的类型和类型检查:

<Input value="{
  path: 'myField', 
  type: 'sap.ui.model.type.String',
  constraints: {
    minLength: 1,
    maxLength: 20
  }
}" />

然后触发创建。如果使用了changeSet,则应在其中传递其名称。

this.getModel().submitChanges('myChanges');

优点之一是,除了不必使用JSON模型之外,如果您检索此数据并将元素与现有结果绑定,则代码是相同的。您也可以在其上使用submitChanges。除此以外,它发送更新而不是创建。

更多信息:https://ui5.sap.com/sdk#/api/sap.ui.model.odata.v2.ODataModel/methods/createEntry