Dan*_*iel 5 javascript json typescript angular
目前我正在加载一个 JSON 文件,如下所示:
翻译服务.ts
@Injectable()
export class TranslationService {
private _messages = [];
constructor(private _http: Http) {
var observable = this._http.get("/app/i18n/localizable.it.strings").map((res: Response) => res.json());
observable.subscribe(res => {
this._messages = res;
});
}
getTranslationByKey(key: string, args?: any[]) {
return this._messages[key];
}
}
Run Code Online (Sandbox Code Playgroud)
localizable.it.strings
{
"home.nav.calendar": "Calendar",
...
}
Run Code Online (Sandbox Code Playgroud)
我TranslationService被注入我的HomeComponent但问题是当我尝试通过管道读取这些值时,它们仍然需要在页面呈现时加载。
翻译.pipe.ts
@Pipe({name: 'translate'})
export class TranslatePipe implements PipeTransform {
constructor(private _translation: TranslationService) {}
transform(value: string, args: string[]) : any {
return this._translation.getTranslationByKey(value);
}
}
Run Code Online (Sandbox Code Playgroud)
知道如何在加载任何页面之前从 JSON 文件加载所有值吗?
我认为您可以对您的服务和管道进行一些调整,以便在数据准备好/加载时进行处理。
首先添加一个可观察量以在数据加载到您的服务中时发出通知:
@Injectable()
export class TranslationService {
private _messages = {};
private translationLoaded : Observable<boolean>;
private translationLoadedObserver : Observer<boolean>;
constructor(private _http: Http) {
this.translationLoaded = Observable.create((observer) => {
this.translationLoadedObserver = observer;
});
var observable = this._http.get("app/i18n/localizable.it.strings").map((res: Response) => res.json());
observable.subscribe(res => {
this._messages = res;
this.translationLoadedObserver.next(true);
});
}
getTranslationByKey(key: string, args?: any[]) {
return this._messages[key];
}
}
Run Code Online (Sandbox Code Playgroud)
管道可以订阅此可观察量,以透明地更新消息的值,方式如下async:
@Pipe({
name: 'translate',
pure: false // required to update the value when data are loaded
})
export class TranslatePipe implements PipeTransform {
constructor(private _ref :ChangeDetectorRef, private _translation: TranslationService) {
this.loaded = false;
}
transform(value: string, args: string[]) : any {
this.translationLoadedSub = this._translation.translationLoaded.subscribe((data) => {
this.value = this._translation.getTranslationByKey(value);
this._ref.markForCheck();
this.loaded = true;
});
if (this.value == null && this.loaded) {
this.value = this._translation.getTranslationByKey(value);
}
return this.value;
}
_dispose(): void {
if(isPresent(this.translationLoadedSub)) {
this.translationLoadedSub.unsubscribe();
this.translationLoadedSub = undefined;
}
}
ngOnDestroy(): void {
this._dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
这是相应的 plunkr:https://plnkr.co/edit/VMqCvX ?p=preview 。
| 归档时间: |
|
| 查看次数: |
2072 次 |
| 最近记录: |