Принудительное обнаружение изменений из службы с помощью стратегии обнаружения изменений как OnPush
Наше приложение Angular2 использует службу перевода, чтобы обеспечить перевод, как это
getResourceValue(resKey: string): string {
return this.translateService.getResourceValue(resKey);
}
Сервис получает асинхронный перевод из вызовов API с каждым загруженным компонентом. Наблюдаемая часть держит весь перевод асинхронным. Если перевод для этого ключа не готов, он просто возвращает ключ. И затем обновляет его правильной строкой, когда перевод готов.
в шаблоне:
getResourceValue('Page-Title')
Который работает отлично.
Но некоторые страницы имеют "ChangeDetectionStrategy.OnPush". Эти страницы не будут вызывать обнаружение изменений при изменении данных перевода. Все работает без этой настройки.
У меня вопрос: есть ли способы заставить обнаружение где-то только для перевода?
1 ответ
Благодаря angular2localization это исправлено путем передачи ChangeDetectorRef следующим образом:
В сервисе у нас есть функция для загрузки переданного в JSON-файла и объект ChangeDetectorRef:
getTranslation(resPath: string, changeDetector?: ChangeDetectorRef): Observable<any> {
return Observable.of(this.processTranslation(resPath, changeDetector));
}
}
Когда перевод будет завершен, changeDetector вызовет markForCheck mothod;
В каждом компоненте, который нуждается в переводе, мы будем вызывать эту функцию и передавать в этот компонент changeDetector.
Это решает проблему красиво.
Надеюсь, это может кому-нибудь помочь.