Angular 6 - Обновление * ngIf после загрузки компонентов

Составная часть:

import { Component, OnInit } from '@angular/core';

// Services
import { AuthService } from './services/auth.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.less']
})
export class AppComponent implements OnInit {
  user: Object;
  authorized: boolean;

  constructor(private authService: AuthService) {}

  ngOnInit() {
    this.authorized = this.authService.loggedIn();
  }
}

HTML:

<app-navbar *ngIf = "authorized"></app-navbar>

<div id = "content"
     *ngIf = "authorized">
    <app-sidebar></app-sidebar>

    <div class = "wrapper full-width">
        <router-outlet></router-outlet>
    </div>
</div>

<div class = "container mt-6"
     *ngIf = "!authorized">
    <router-outlet></router-outlet>
</div>

this.authService.loggedIn(); возвращает true или false, что используется для отображения некоторых элементов в * ngIf HTML. Пользователь перенаправляется на эту страницу после входа в систему, поэтому * ngIf не читаются автоматически. Вместо этого вам нужно обновить страницу, чтобы все обновилось правильно.

Насколько мне известно, я не могу подписаться на this.authService.loggedIn(), поскольку он не является наблюдаемым, поэтому я не уверен, как автоматически обновлять представление, когда пользователь впервые просматривает компонент. Вот сам сервис для справки:

loggedIn() {
    if (localStorage.id_token === undefined ) {
      return false;
    } else {
      const helper = new JwtHelperService();
      return !helper.isTokenExpired(localStorage.id_token);
    }
  }
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
816
1

Ответы 1

Вы можете убедиться, что свойство authorized обновлено, сделав его геттером:

public get authorized(): boolean {
  return this.authService.loggedIn();
}

Кажется, это отлично работает, но нарушает загрузку других компонентов. Теперь, когда я пытаюсь перейти к другому маршруту, сам маршрут изменяет содержимое HTML или <router-outlet> не обновляется, пока я не обновлю страницу. Что могло быть причиной того, что содержимое маршрута, по которому щелкнули, не загружалось?

Joe Berthelot 06.08.2018 03:24

Этот код получает только текущее значение от службы. Я не знаю, что вызывает проблему с загрузкой. Вы можете проверить в консоли, есть ли сообщения об ошибках.

ConnorsFan 06.08.2018 03:48

Вместо использования ngIf, чтобы скрыть выход маршрутизатора, вы можете рассмотреть возможность реализации охранник маршрута, чтобы разрешить навигацию только тогда, когда пользователь вошел в систему.

ConnorsFan 06.08.2018 03:53

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