【问题标题】:How to convert Observable<Some> to other Observable<Other>如何将 Observable<Some> 转换为其他 Observable<Other>
【发布时间】:2021-09-05 12:39:21
【问题描述】:

我想使用 Transloco 并从现有的 REST API 而非 i18n 文件中收集翻译。我用休息服务调用替换了 TranslocoHttpLoader 中的行:

  getTranslation(lang: string): Observable<Translation> {
    // return this.http.get<Translation>(`/assets/i18n/${lang}.json`);
    return this.translationService.fetchTranslations();
  }

Translation 是 Transloco 类型:

export declare type Translation = HashMap;

export declare type HashMap<T = any> = {
    [key: string]: T;
};

翻译 REST API 正在返回:

{
  "languageKeys": [
    {
      "key": "hello",
      "value": "hello transloco"
    },
    ...
 ]
}

所以

export class TranslationRest {
  languageKeys: LanguageKeyRest[] = [];
}

export class LanguageKeyRest {
  constructor(public key: string, public value: string) {}
}

所以我需要将Observable&lt;TranslationRest&gt;“转换”为 Transloco 使用的Observable&lt;Translation&gt;

翻译服务

public fetchTranslations(): Observable<Translation> {
  const response: Observable<TranslationRest> = this.httpClient.post<TranslationRest>(this.url, this.body, {'headers': this.headers});
  return this.convert1(response);
}

这个最简单的(用于测试目的)convert1 方法按预期工作:

private convert1(response: Observable<TranslationRest>): Observable<Translation> {
  return of({hello: 'hello transloco'})
}

html:

{{'hello' | transloco}}

在浏览器中显示:hello transloco

但是如何实现真正的转换呢?我试图关注How to pipe / map an Observable in Angular 但没有运气:

  private convert2(response: Observable<TranslationRest>): Observable<Translation> {
    return response.pipe(
      map((res: TranslationRest) => res.languageKeys.map(item =>{
        item.key: item.value
      }))
    )
  }

【问题讨论】:

    标签: angular typescript rxjs transloco


    【解决方案1】:

    你转换不正确

    private convert2(response: Observable<TranslationRest>): Observable<Translation> {
        return response.pipe(
          map((res: TranslationRest) => res.languageKeys.reduce((obj, item) => ({
            ...obj,
            [item.key]: item.value,
          }), {}))
        )
    }
    
    

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 2021-10-27
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 2016-07-01
      相关资源
      最近更新 更多