在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模型。我假设这将有助于验证数据类型,而不是手动进行。
答案 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