1

我正在使用 Breeze 1.5.1 构建一个 Angular 1.3.5 应用程序来与 SAP 网关服务器交互。一项要求是通过重用服务器提供的人类可读元数据标签来最大限度地减少重复的 UI 翻译。据我所知,Breeze 对自定义元数据属性的支持应该允许我将这些标签与所有标准实体元数据一起加载,但我正在努力弄清楚如何解决这个问题。

元数据服务提供以下格式的数据:

<EntityType Name="ContactPersonEmail" sap:content-version="1">
  <Key>
    <PropertyRef Name="email"/>
  </Key>
  <Property Name="cpGuid" Type="Edm.Guid" sap:label="Long Text String for XML and HTML Output"/>
  <Property Name="primaryEmail" Type="Edm.Boolean" Nullable="false" sap:label="Standard No."/>
  <Property Name="email" Type="Edm.String" Nullable="false" MaxLength="241" sap:label="E-Mail Address"/>
  <Property Name="homeIndicator" Type="Edm.Boolean" Nullable="false" sap:label="Home address"/>
  <Property Name="location" Type="Edm.String" Nullable="false" MaxLength="2" sap:label="Email Type"/>
  <Property Name="emailType" Type="Edm.String" Nullable="false" MaxLength="2" sap:label="Email Type"/>
  <Property Name="emailTypeText" Type="Edm.String" Nullable="false" MaxLength="60"/>
</EntityType>

其中sap:label属性是我要添加到 Breeze 实体类型的文本。这可行吗?Breeze 文档似乎主要集中在从本地文件或已加载的数据加载自定义元数据,而不是在数据加载时包含额外的属性,所以这种方法可能是幼稚的。

解决此问题后,我将研究如何将文本放到页面上,但这是以后的事情。

更新:解决方案

根据下面 Jeremy 的回答,我能够通过初始化函数运行元数据响应,并通过 metadataProperty 的extension属性捕获标签字段。示例(重构前)代码如下:

// ...
if (entityProperty) {
  if (typeof metadataProperty.extensions !== "undefined" && metadataProperty.extensions.length) {
    var extension = metadataProperty.extensions[0];
    entityProperty[extension.name] = extension.value;
  }
}
// ...

此实例中的 extension.name 是“label”,它是数组中唯一出现的扩展名。现在剩下的就是将数据放到 UI 上,但我相信这将是微不足道的 :)

4

1 回答 1

1

认为这是可能的,尽管我承认我只补充了 Breeze Metadata JSON 模式,而不是 XML。

在客户端上获取元数据时,您只需要进行一些额外的处理,以使用您的自定义元数据属性来补充微风实体类型。在下面的示例代码中,添加了四个自定义元数据道具:displayName、displayOrder、autoGenerateField 和 allowEmptyStrings。

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);
});

这是我对类似问题的回答,但是 OP 的后端是 .NET,并且他们使用的是 Breeze Metadata JSON 模式。

于 2014-12-02T15:06:20.657 回答