Как запустить дайджест цикл?

419
24 октября 2017, 03:41

Посоветуйте пожалуйста способ(ы), при помощи которого можно заставить шаблон обновить значения отображаемых переменных.

Есть простейший сайт с двумя страничками и модулем роутинга. Он состоит из главного компонента и двух дочерних. В главном компоненте я сделал переключатель языка. этот переключатель находится вне

<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>
Answer 1

Вам следует делать проверку не в конструкторе, а в одном из 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);
}
Answer 2

Чтобы руками запустить дайджест цикл тебе необходим класс ApplicationRef https://angular.io/api/core/ApplicationRef , который имеет метод tick()

constructor(private appRef: ApplicationRef)

someMethod() {
  this.appRef.tick(); // start digest cycle
} 
READ ALSO
{} + {}. Почему такой результат?

{} + {}. Почему такой результат?

{} + {} "[object Object][object Object]"

270
Передать данные из формы в google charts [требует правки]

Передать данные из формы в google charts [требует правки]

Не работает диаграмма при передаче данных из формы, пожалуйста, подскажите в чем ошибкаhttps://jsbin

343
Вывод связанных данных в symfony

Вывод связанных данных в symfony

Есть сущности категории(category), подкатегории(subcategory), товары(product)

248
Как вывести определённый элемент в smarty?

Как вывести определённый элемент в smarty?

ЗдравствуйтеЕсть код для формирования сообщения на e-mail с помощью smarty v2

397