Посоветуйте пожалуйста способ(ы), при помощи которого можно заставить шаблон обновить значения отображаемых переменных.
Есть простейший сайт с двумя страничками и модулем роутинга. Он состоит из главного компонента и двух дочерних. В главном компоненте я сделал переключатель языка. этот переключатель находится вне
<router-outlet></router-outlet>
, а потому доступен на каждой из двух внутренних страничек.
Переключатель языка представляет из себя mat-slide-toggle из стандартной библиотеки материал. Переключатель работает следующим образом:
tpl:
<mat-slide-toggle class="toggler-lang" (click)="toggleLang()"></mat-slide-toggle>
component:
export class AppComponent implements OnInit {
private lang: boolean = false;
ngOnInit() {
localStorage.removeItem('isEnLang');
};
private toggleLang() {
this.lang = !this.lang;
if(this.lang == true) {
localStorage.isEnLang = 'true';
} else {
localStorage.removeItem('isEnLang');
}
};
}
то есть если выбран язык английский, то в локалсторадже есть значение, если выбран язык русский, то в локалстородже нет значения.
Проблема в том, что находясь на страничке "Программа", я при помощи переключателя языка меняю язык, но после этого изменения не отображаются. Чтобы изменения отобразились необходимо уйти со странички "Программа" и снова вернуться на неё. Эту последовательность действий можно воспроизвести на живом примере
Вот ссылка на gitHub
Вот так в Компоненте, который соответствуют страничке "Программа" происходит проверка языка:
private isEnLang: boolean;
constructor() {
this.isEnLang = localStorage.isEnLang ? true : false;
console.log('this.isEnLang', this.isEnLang);
};
Так происходит вывод в шаблоне Программы:
<div class="title" *ngIf="line.title">{{ isEnLang ? line?.title_en.trim() : line?.title.trim() }}</div>
Вам следует делать проверку не в конструкторе, а в одном из component lifecycle hooks.
Don't fetch data in a component constructor. You shouldn't worry that a new component will try to contact a remote server when created under test or before you decide to display it. Constructors should do no more than set the initial local variables to simple values.
constructor следует использовать только для создания/инициализации полей класса, например:
constructor(private isEnLang: boolean) {};
ngDoCheck() {
this.isEnLang = localStorage.isEnLang ? true : false;
console.log('this.isEnLang', this.isEnLang);
}
Чтобы руками запустить дайджест цикл тебе необходим класс ApplicationRef https://angular.io/api/core/ApplicationRef , который имеет метод tick()
constructor(private appRef: ApplicationRef)
someMethod() {
this.appRef.tick(); // start digest cycle
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости