异步管道不适用于主题

Ang*_*ant 9 rxjs subject-observer angular

我在服务中有以下 BehaviorSubject:

  isAuthenticated = new BehaviorSubject<boolean>(false);
Run Code Online (Sandbox Code Playgroud)

我在组件中按如下方式使用它:

  authenticated: Observable<boolean>;

  constructor(private accountService: AccountService) { }

  ngOnInit() {
    this.authenticated = this.accountService.isAuthenticated.asObservable();
  }
Run Code Online (Sandbox Code Playgroud)

在模板中,我执行以下操作:

  <li class="login-button" *ngIf="!authenticated | async">
    <a (click)="authenticate()">Log in</a>
  </li>
  <li *ngIf="authenticated | async">
    <a>Logged in</a>
  </li>
Run Code Online (Sandbox Code Playgroud)

问题是我没有看到这两个中的任何一个li,尽管假设第一个应该出现,因为我将 Subject 的初始值分配给 false。

我究竟做错了什么?

pix*_*its 10

我怀疑它的操作顺序-您的订阅需要括号:

<li class="login-button" *ngIf="!(authenticated | async)">
Run Code Online (Sandbox Code Playgroud)


Wil*_*ilt 5

我想使用ng-if-else发布一个解决方案,这在您的特定情况下可能更直观:

<li class="login-button" *ngIf="(authenticated | async); else unauthenticated">
  <a>Logged in</a>
</li>
<ng-template #unauthenticated>
  <a (click)="authenticate()">Log in</a>
</ng-template>
Run Code Online (Sandbox Code Playgroud)

或者,您可以将这两个案例放入一个ng-template:

<li class="login-button" *ngIf="(authenticated | async); then authenticated else unauthenticated"></li>
<ng-template #authenticated ><a>Logged in</a></ng-template>
<ng-template #unauthenticated><a (click)="authenticate()">Log in</a></ng-template>
Run Code Online (Sandbox Code Playgroud)

希望它对来到这里的其他人有任何用处。