【发布时间】:2021-12-16 15:42:57
【问题描述】:
我有一堆正在处理本地化的自定义管道:
例如,这里有一个简单的管道,它将根据语言显示全名/姓氏或姓氏/全名:
@Pipe({ name: 'fullname' })
export class FullnamePipe implements PipeTransform, OnDestroy {
private language = Language.EN_US;
private subscriptions = new SubSink();
constructor(private translateService: TranslateService) {
this.language = LanguageUtils.toAppLanguage(this.translateService.currentLang);
this.subscriptions.add(
this.translateService.onLangChange.subscribe(({ lang }) => {
this.language = LanguageUtils.toAppLanguage(lang);
})
);
}
transform(value: string, language?: Language): string {
const [firstname, lastname] = value.split('|');
const firstNameFirst = LanguageUtils.isFirstNameFirst(language || this.language);
return firstNameFirst ? `${firstname} ${lastname}` : `${lastname} ${firstname}`;
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
}
现在这是一堆功能完全相同的管道之一,只是变换方法发生了变化。
我希望这些管道能够根据this.language 更改自己重绘(因此更改其显示值)。
现在,我知道至少有两种解决方案:
-
使用
pure:false它会起作用,因为更改语言会触发检测。但这样做的缺点是管道每次检测触发时都会运行,而不仅仅是语言。所以这太矫枉过正了。 -
添加一个参数(如上),但这意味着每个使用管道的组件实际上都需要将一个 observable 传递给具有语言值的管道。这使得每个组件都比应有的“更智能”。
有没有一种解决方案可以让我根据需要手动重绘管道?
【问题讨论】:
-
AFAIK 需要更改参数值,否则必须将管道设置为
pure: false才能调用transform
标签: angular angular-pipe