Когда я впервые меняю язык своего приложения, служба перевода делает запрос на файл, представляющий новый язык, мои строки «умные» компоненты отражают обновление правильно, но никаких «чистых/немых» компонентов нет, они остаются на предыдущем языке. Однако, как только новый языковой файл был загружен в кеш, и я продолжаю менять языки, все работает нормально.ng2-translate - строки перевода, не обновляемые в компонентах с обнаружением изменений OnPush
Кажется, что любой чистый компонент не разрешает обновления от ответа ajax для нового языкового файла, он правильно изменит язык, если файл уже загружен в кеш. Опять же, это только для компонентов, которые используют ChangeDetectionStrategy.OnPush
Я понимаю, что changeDetection использует Входы и Наблюдения в немых компонентах, но я не так хорошо знаком, когда речь идет о трубах в этом случае. Возможно, я что-то упустил?
UDPATE
мне удалось взломать исправить, это не хорошо, но это работает. Это конструктор в моей службе, который обертывает службу Translate.
Я проверяю, есть ли у меня язык json-файла уже в кеше для языка, который я собираюсь выбрать. Если у меня его нет, я использую метод reloadLang в ng2-translate, чтобы пойти и получить его. После этого я использую пустой тайм-аут, а затем вызываю «translate.use». Там есть проблема синхронизации, потому что, если я выберу таймаут, это не сработает. Если у меня уже есть файл перевода, который я собираюсь переключить, я просто использую translate.use как обычно, и все работает нормально.
constructor(private translate: TranslateService, public store: Store<any>) {
// this language will be used as a fallback when a translation isn't found in the current language
translate.setDefaultLang('en');
// subscribe to changes
store.select('i18n').subscribe((state: MultilingualStateI) => {
// update ng2-translate which will cause translations to occur wherever the TranslatePipe is used in the view
if (this.translate.getLangs() && (this.translate.getLangs().indexOf(state.lang) > -1)) {
this.translate.use(state.lang)
} else {
this.translate.reloadLang(state.lang).take(1).subscribe(() => {
setTimeout(() => this.translate.use(state.lang), 0);
});
}
});
}
Я не совсем уверен, что здесь происходит, но это, кажется, смесь между использованием ChangeDetectionStrategy.OnPush и свежий ответ от запроса файла перевода. Если кто-либо еще увидит это, добавьте свой ввод.
Я столкнулся с той же проблемой. Что такое параметр «Мастер», который вы передаете своему конструктору? – Isthar