Angular 2: используйте * ngIf с async

Есть две кнопки «Войти» и «Выход». Изначально видна только кнопка входа в систему. Но после аутентификации кнопка входа должна измениться на кнопку выхода. Но у меня это почему то не работает, как я могу это исправить?

html:

<div *ngIf = "!(authService.userSignedIn$ | async)">
     <button type = "submit" class = "btn btn-danger" data-toggle = "modal" data-target = "#exampleModal">
        Login
    </button>
</div>
<div *ngIf = "(authService.userSignedIn$ | async)">
    <button type = "submit" class = "btn btn-danger" (click) = "logOut()">Logout</button>
</div>

Component.ts:

export class InfoComponent implements OnInit {

  signInUser = {
    email: '',
    password: ''
  };

  @Output() onFormResult = new EventEmitter<any>();

  constructor(protected authService:AuthService, private router:Router) {

   }


  ngOnInit() {
  }


  logOut(){
    this.authService.logOutUser().subscribe(() => this.router.navigate(['/info']));
  }

  onSignInSubmit(){

    $('#exampleModal').modal('hide');

    this.authService.logInUser(this.signInUser).subscribe(

        res => {
          if (res.status == 200){
            // loginForm.resetForm();
            this.onFormResult.emit({signedIn: true, res});
            this.router.navigate(['/profile']);
          }
        },

        err => {
          console.info('err:', err);
          // loginForm.resetForm();
          this.onFormResult.emit({signedIn: false, err});
        }
    )

  }

}

Что не работает?

bugs 17.04.2018 11:07

Можете ли вы предоставить свой файл component.ts?

Anuradha Gunasekara 17.04.2018 11:08

Кнопка входа не меняется на кнопку выхода после аутентификации

Jack 17.04.2018 11:09

@ Джек, все

Jack 17.04.2018 11:12

Зачем вам здесь асинхронный режим? Я не думаю, что это должно быть необходимо

Veselin Davidov 17.04.2018 11:12

используйте <div *ngIf = "!authService.userSignedIn$"> и <div *ngIf = "authService.userSignedIn$">

mast3rd3mon 17.04.2018 11:21

без async вам придется добавить subscription в компонент.

Anshuman Jaiswal 17.04.2018 11:55
Тестирование функциональных 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
0
7
829
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте BehaviorSubject вместо Subject

userSignedIn$:BehaviorSubject<boolean> = new BehaviorSubject(false);

вы можете использовать ngIf-else с ng-template следующим образом:

<div *ngIf = "!(authService.userSignedIn$ | async); else logout">
     <button type = "submit" class = "btn btn-danger" data-toggle = "modal" data-target = "#exampleModal">
        Login
    </button>
</div>
<ng-template #logout>
<div>
    <button type = "submit" class = "btn btn-danger" (click) = "logOut()">Logout</button>
</div>
</ng-template>

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