这是我的自定义管道
import { Pipe, PipeTransform } from '@angular/core';
import { LanguageFile } from './files/language';
@Pipe({
name: 'lang'
})
export class NgxTogetherLanguageTranslatorPipe implements PipeTransform {
language: any;
constructor() {
this.language = LanguageFile.language;
}
transform(value: string, falg = "fa"): string {
if (typeof (value) != typeof ('x1'))
return value;
let key = value ? value.toLowerCase() : value;
if (sessionStorage.getItem('languageFlag'))
falg = sessionStorage.getItem('languageFlag') || falg;
if (window && falg == "fa")
return this.language[key] ? (this.language[key].fa || value) : value;
else
return this.language[key] ? (this.language[key].en || value) : value;
}
}
当我将LanguageFile上的另一个文件或变量提供到模块中时,我是否可以覆盖它?
我已经为这个管道创建了一个库,我想在多个项目中使用它,我的挑战是想要使用不同的文件这是文件内容:
export class LanguageFile {
public static language = {
"cancel": { "fa": "لغو", "en": "Cancel" },
"ok": { "fa": "تایید", "en": "OK" },
}
}
是的,您可以使用InjectionToken来实现这一点。
基本上,您可以创建令牌
const LANGUAGE = new InjectionToken<string>('language');
并且在父级上提供您想要在管道中使用的值(父级-内部有管道的模块或组件(
如果您知道要在编译时使用的值,您可以使用类似的东西
{providers: [{provide: LANGUAGE, useValue: LanguageFile.language}]
如果你需要在运行时使用一些逻辑,你可以使用useFactory代替
最后,只需像一样在管道中注入价值
constructor(@Inject(LANGUAGE) private language: string) {}