SAPUI5:如何以编程方式访问 OData 模型数据?

SAPUI5: How can I access ODataModel data programatically?

当我在代码中创建模型时,我通常使用:

var oData = {
  "name" : "",
  "description" : "",
  "phone" : ""
};
var oModel = new JSONModel(oData);
this.setModel(oModel, "data");

之后,我可以使用以下方法访问模型及其值:

var oModel = this.getView().getModel("data");
var description = oModel.getProperty("/description");

但是,这是使用内部 json 结构。当我使用来自 Hana 平台的 oData 目标或当我在我的 SAPUI5 项目上使用模型服务器时,如何获取 oModel 结构?

getProperty 方法存在于 ODataModel (v2) 和任何其他模型上。因此用法差异很大:

ODataModel 如何存储数据

这是因为 ODataModel 通过其键存储数据,例如

{
  "EntitySet('Key-1')": {},
  "EntitySet('Key-2')": {},
  "EntitySet('Key-3')": {},
  "ExpandedEntitySet(EntityID='Key-3',ExpandedEntityIS='5')": {}
}

检查 oMyODataDataModel.oData 以查看实际存储的数据(但请不要以这种方式使用或操作它,因为这是内部 API)。

ODataModels getProperty

要检索单个实体,您必须这样说:

oDataModel.getProperty("/EntitySet('Key-1')");

尽管集合的绑定路径是 /EntitySet 请求

oDataModel.getProperty("/EntitySet");

return 什么都不会。发生这种情况是因为 oData["EntitySet"] 的内部存储数据结构中没有实体,并且 getProperty 方法仍然只是在此内部结构中进行查找。

包括展开的实体

ODataModels getProperty 方法的一个有趣之处是 bIncludeExpandEntries 参数。如果将其设置为 true,访问的实体将被 returned,包括所有可能扩展的 NavigationProperties。在上面的例子中

oDataModel.getProperty("/EntitySet('Key-3')");

也会return"ExpandedEntitySet(EntityID='Key-3',ExpandedEntityIS='5')"用它。

ODataModels getObject

ODataModels getObject 方法具有更大的灵活性,因为它允许在本地使用 OData 参数 $select$expand。获取 EntitySet 仍然是不可能的...注意:它不会加载任何丢失的数据并且 returned 数据可能不完整!