【发布时间】:2018-02-01 10:28:14
【问题描述】:
我正在尝试将 ChangeDetectorRef 服务注入到我的管道中,但是在启动时 该应用程序这是我的错误:没有 ChangeDetectorRef 的提供者!
我已经看到了几个我正在尝试做的事情的例子(翻译管道或异步管道)。但它不适用于我的......
这是我的烟斗:
import {Injectable, Pipe, PipeTransform, ChangeDetectorRef, OnDestroy} from '@angular/core';
import {Subject} from 'rxjs/Subject';
import {LangChangeEvent, TranslateService} from '@ngx-translate/core';
@Injectable()
@Pipe({
name: 'CollectionTranslation',
pure: false
})
export class CollectionPipe implements PipeTransform, OnDestroy {
value: string;
lastKey: string;
onLangChange: Subject<LangChangeEvent>;
constructor(private translate: TranslateService, private _ref: ChangeDetectorRef) {
}
updateValue(key: string, lang: string) {
this.value = this.collectionTranslation(key, lang);
this.lastKey = key;
this._ref.markForCheck();
}
transform(collectionParam: string) {
// lang parameter is just here to execute the pipe each time the current lang is changed.
// it's not used in the pipe
if (this.lastKey === collectionParam) {
return this.value;
}
this.updateValue(collectionParam, localStorage.getItem('kia.language'));
if (!this.onLangChange) {
this.onLangChange = this.translate.onLangChange.subscribe((event: LangChangeEvent) => {
if (this.lastKey) {
this.lastKey = null; // we want to make sure it doesn't return the same value until it's been updated
this.updateValue(collectionParam, event.lang);
}
});
}
return this.value;
}
private collectionTranslation(collectionParam: string, lang: string): string {
let collection = '';
if (collectionParam === null || collectionParam === undefined) {
return '';
}
const coll = collectionParam.toUpperCase();
if (lang === 'fr') {
collection = coll.startsWith('E') || coll.startsWith('S') ? 'ETE ' : 'HIVER ';
} else {
// Lang EN
collection = coll.startsWith('E') || coll.startsWith('S') ? 'SUMMER ' : 'WINTER ';
}
collection = collection + coll.substring(coll.length - 2);
return collection;
}
_dispose(): void {
if (typeof this.onLangChange !== 'undefined') {
this.onLangChange.unsubscribe();
this.onLangChange = undefined;
}
}
ngOnDestroy(): void {
this._dispose();
}
}
对我来说,没有必要将 ChangeDetectorRef 添加到模块中,因为它是核心。
感谢您的帮助!
【问题讨论】:
标签: angular typescript pipe