簡體   English   中英

在 Breeze 自定義元數據中包含 SAP Gateway 標簽

[英]Include SAP Gateway labels in Breeze custom metadata

我正在構建一個 Angular 1.3.5 應用程序,使用 Breeze 1.5.1 與 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 上,但我相信這很簡單:)

認為這是可能的,盡管我承認我只補充了 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 架構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM