Принудительное обнаружение изменений из службы с помощью стратегии обнаружения изменений как 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.

Это решает проблему красиво.

Надеюсь, это может кому-нибудь помочь.

Другие вопросы по тегам