Angularjs 在自定义元数据中包含SAP网关标签
我正在构建一个Angular 1.3.5应用程序,使用Breeze 1.5.1与SAP网关服务器进行接口。一个要求是通过重新使用服务器提供的人类可读的元数据标签来最小化重复的UI翻译。据我所知,Breeze对自定义元数据属性的支持应该允许我将这些标签与所有标准实体元数据一起加载,但我正努力弄清楚如何实现这一点 元数据服务提供以下格式的数据:Angularjs 在自定义元数据中包含SAP网关标签,angularjs,odata,breeze,sap-gateway,Angularjs,Odata,Breeze,Sap Gateway,我正在构建一个Angular 1.3.5应用程序,使用Breeze 1.5.1与SAP网关服务器进行接口。一个要求是通过重新使用服务器提供的人类可读的元数据标签来最小化重复的UI翻译。据我所知,Breeze对自定义元数据属性的支持应该允许我将这些标签与所有标准实体元数据一起加载,但我正努力弄清楚如何实现这一点 元数据服务提供以下格式的数据: 其中,sap:label属性是我要添加到Breeze实体类型的文本。这是否可行?Breeze文档似乎主要关注从本地文件或已加载的数据加载自定义元数据,而
其中,sap:label
属性是我要添加到Breeze实体类型的文本。这是否可行?Breeze文档似乎主要关注从本地文件或已加载的数据加载自定义元数据,而不是在数据加载时包含附加属性,因此这种方法可能很幼稚
一旦解决了这个问题,我将研究如何将文本放到页面上,但这将留待以后
更新:解决方案
根据Jeremy下面的回答,我能够通过初始化函数运行元数据响应,并通过metadataProperty的扩展
属性捕获标签字段。示例(预重构)代码如下:
/。。。
if(实体属性){
if(typeof metadataProperty.extensions!=“未定义”&&metadataProperty.extensions.length){
var extension=metadataProperty.extensions[0];
entityProperty[extension.name]=extension.value;
}
}
// ...
此实例中的extension.name是“label”,它是数组中出现它的唯一扩展。现在剩下的就是将数据放到UI上,但我相信这很简单:)我认为这是可能的,尽管我承认我只补充了Breeze元数据JSON模式,而没有补充XML
在客户端获取元数据时,您只需要做一些额外的处理,以使用自定义元数据属性补充breeze实体类型。在下面的示例代码中,添加了四个自定义元数据道具:displayName、displayOrder、autoGenerateField和AllowEmptyString
function initializeMetadataStore(metadataStore, metadata) {
var metadataType, metadataProperty, entityProperty, i, j;
for (i = 0; i < metadata.schema.entityType.length; i++) {
metadataType = metadata.schema.entityType[i];
var entityType = metadataStore.getEntityType(metadataType.name);
for (j = 0; j < metadataType.property.length; j++) {
metadataProperty = metadataType.property[j];
entityProperty = entityType.getProperty(metadataProperty.name);
if (entityProperty) {
if (typeof metadataProperty.displayName !== 'undefined') {
entityProperty.displayName = metadataProperty.displayName;
}
if (typeof metadataProperty.displayOrder !== 'undefined') {
entityProperty.displayOrder = metadataProperty.displayOrder;
}
if (typeof metadataProperty.autoGenerateField !== 'undefined') {
entityProperty.autoGenerateField = metadataProperty.autoGenerateField;
}
if (typeof metadataProperty.allowEmptyStrings !== 'undefined') {
entityProperty.allowEmptyStrings = metadataProperty.allowEmptyStrings;
}
}
}
}
}
var entityManager = ....something...;
entityManager.fetchMetadata(function (metadata) {
return initializeMetadataStore(entityManager.metadataStore, metadata);
});
函数initializeMetadataStore(元数据存储,元数据){
变量metadataType,metadataProperty,entityProperty,i,j;
对于(i=0;i
不过OP的后端是.NET,他们使用的是Breeze元数据JSON模式。谢谢Jeremy,我会尝试并相应更新。我喜欢使用扩展数组来包含自定义注释的方式。这感觉比直接将每个自定义注释添加到元数据属性更干净。谢谢,但我不能承担责任-Breeze自动做到了这一点,我只是利用了它!