【问题标题】:Angular2 dynamic pipeAngular2动态管道
【发布时间】:2016-11-12 16:44:31
【问题描述】:

我正在使用管道来国际化我的应用程序:

import {Pipe, PipeTransform} from '@angular/core';
import {I18nService} from './i18n.service';

@Pipe({
  name: 'i18n'
})
export class I18nPipe implements PipeTransform {

  constructor(private i18nService: I18nService) {
  }

  transform(value: any, args?: any): any {
    return this.i18nService.get(value);
  }

}

这个管道调用一个服务:

import {Injectable} from '@angular/core';

const i18n = {
  en: {
    hello: 'Hello'
  },
  fr: {
    hello: 'Salut'
  }
};

@Injectable()
export class I18nService {

  language: string = 'en';

  constructor() {
  }

  get(key: string) {
    let languageObject = i18n[this.language];
    return languageObject[key];
  }

}

在一个组件中我是这样使用它的:

<div (click)="switchLanguage()">{{'hello' | i18n}}</div>

switchLanguage() {
  this.i18nService.language = 'en' ? 'en' : 'fr';
}

但是,即使服务语言值已更改,管道结果也不会重新评估。我需要导航到任何其他路线并返回查看是否考虑了此更改。

我试过 ApplicationRef.tick() 和 NgZone.run(callback) 没有任何运气。

知道如何重新评估应用程序的每个管道,而无需导航到另一条路线或重新加载页面?

谢谢

【问题讨论】:

标签: angular angular2-pipe


【解决方案1】:

你的管道应该被标记为不纯的,因为它对给定输入的转换结果可能会改变,即使输入没有改变。

请参阅the documentation 了解详情。

@Pipe({
  name: 'i18n',
  pure: false
})

【讨论】:

  • 这正是我所需要的,非常感谢! (请注意,下次阅读完整文档...)
  • 但是,从性能角度来看,这似乎不是一个好的选择,特别是对于将在任何地方使用的 i18n 管道。我有机会手动触发对“纯”管道的重新评估吗?
  • 我不这么认为。指令可能比管道更好。 AngularJS 1.x 过滤器也有同样的性能问题,$translate 项目建议使用它的指令而不是它的管道。也就是说,如果您的实现看起来确实在您的问题中,并且不需要插值或其他任何东西,那么获得翻译将非常快,而且可能足够快。
  • 在每次更改时重新评估不纯管道或繁琐的指令看起来都很昂贵,只是为了避免重新加载页面。语言更改不会经常发生,我很遗憾地说我想我会重新加载页面。
  • 令人惊讶的是,无法使用纯管道的“新版本”手动重新创建组件树
猜你喜欢
  • 2017-12-18
  • 1970-01-01
  • 2017-08-25
  • 2016-08-28
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2016-12-24
相关资源
最近更新 更多