Sapui5 如何从OData元数据创建本地空JSON模型

Sapui5 如何从OData元数据创建本地空JSON模型,sapui5,Sapui5,有没有办法从oData服务的元数据创建一个本地空JSON文件(填充了所有实体和属性)?我在创建场景中需要它,在这里我可以将属性绑定到视图控件。我尝试了以下代码,但没有成功。谢谢你的建议 this.getOwnerComponent().getModel().getMetaModel().getODataEntitySet("EntitySetName"); 错误: Uncaught TypeError:无法读取null的属性“getObject” 位于constructor.h.getODat

有没有办法从oData服务的元数据创建一个本地空JSON文件(填充了所有实体和属性)?我在创建场景中需要它,在这里我可以将属性绑定到视图控件。我尝试了以下代码,但没有成功。谢谢你的建议

this.getOwnerComponent().getModel().getMetaModel().getODataEntitySet("EntitySetName");
错误:

Uncaught TypeError:无法读取null的属性“getObject”
位于constructor.h.getODataEntityContainer(ODataModel dbg.js:692)
位于constructor.h.getODataEntitySet(ODataModel dbg.js:731)
评估时(评估时的准备创建页面(ObjectPage.controller.js:74),:1:48)
在f._prepareCreatePage(ObjectPage.controller.js:74)
在f._onObjectPatternMatched(ObjectPage.controller.js:40)
在constructor.b.firevent(EventProvider dbg.js:228)
在构造器上。

不确定您到底想要什么,但是这个脚本将以一个blob的形式以JSON格式编写元数据。之后将显示“在浏览器中保存”对话框

var oDataModel=this.getOwnerComponent().getModel();
oDataModel.attachMetadataLoaded(null,function(){
var oMetaData=oDataModel.getServiceMetadata();//读取元数据
var blob=new blob([JSON.stringify(oMetaData)]{
类型:“文本/普通;字符集=utf-8”
});//使用JSON格式的元数据字符串创建blob
if(navigator.msSaveBlob){
返回navigator.msSaveBlob(blob,“metadata.json”);//用于IE
}否则{
//对于Chrome和FF,我们创建了一个带有下载属性的链接,并触发点击
var sUrl=URL.createObjectURL(blob);//为blob对象创建URL
var oLink=document.createElement(“a”);//创建链接元素
oLink.download=“metadata.json”//Set链接的下载属性
oLink.href=sUrl;//设置链接的href属性
document.body.appendChild(oLink);//将链接附加到body
oLink.click();//单击链接
oLink.remove();//删除链接
}
});

SAP在其示例页面中做了非常类似的工作:

您的第一部分或多或少是正确的,这是一个将元模型存储在单独的JSONModel中的函数:

function () {
    const that = this;

    const oModel = this.getOwnerComponent().getModel();
    const oMetaModel = oModel.getMetaModel();

    oMetaModel.loaded().then(function () {
        that.setModel(oMetaModel, "meta");
    });
}
有趣的部分是如何访问内容:

const sBasePath = "/dataServices/schema/[${namespace}===\'NAME_OF_YOUR_ODATA_SRV\']/entityType/[${name}===\'NameOfYourEntity\']"
const oEntityInformation = oMetaModel.getProperty(sBasePath);

const aKeys = oMetaModel.getProperty(sBasePath + "/key/propertyRef");
const aAllProperties = oMetaModel.getProperty(sBasePath + "/property");
const oSingleProperty = oMetaModel.getProperty(sBasePath + "/property/[${name}===\'NameOfYourProperty\']");
您甚至可以在XML视图中访问模型:

columns="{
    path: 'meta>/dataServices/schema/[${namespace}===\'NAME_OF_YOUR_ODATA_SRV\']/entityType/[${name}===\'NameOfYourEntity\']/property',
    factory: '.columnFactory'
}" 

请注意,
NameOfYourEntity
必须是单个实体的名称,因此末尾没有
Set

我建议您使用
createEntry
并绑定它。您能否详细说明您希望通过读取元数据来实现什么?是否要显示一些批注(如
sap:label=“…”
)?我们要处理的是什么版本的OData?V2还是V4?
columns="{
    path: 'meta>/dataServices/schema/[${namespace}===\'NAME_OF_YOUR_ODATA_SRV\']/entityType/[${name}===\'NameOfYourEntity\']/property',
    factory: '.columnFactory'
}"