【问题标题】:*ngIf not working as expected with observable*ngIf 与 observable 没有按预期工作
【发布时间】:2018-09-12 21:04:52
【问题描述】:

所以我有这两个按钮:

<a class="router-link nav-item" routerLink="/login" *ngIf="!isLoggedIn$ | async">
  Login
</a>
<a class="router-link nav-item" (click)="onLogout()" *ngIf="isLoggedIn$ | async">
  Logout
</a>

并且注销按钮可以完美地工作,一旦用户登录,按钮就会出现。但是登录按钮永远不会出现。

这是isLoggedIn$背后的代码:

isLoggedIn$: Observable<boolean>;

ngOnInit() {
  this.isLoggedIn$ = this.authService.isLoggedIn;
}

授权服务:

private loggedIn = new BehaviorSubject<boolean>(false);

get isLoggedIn() {
  return this.loggedIn.asObservable();
}

希望这是足够的信息并且问题很清楚,在此先感谢!

【问题讨论】:

    标签: angular angular-ng-if


    【解决方案1】:

    将异步管道放在括号中。

    <a class="router-link nav-item" routerLink="/login" *ngIf="!(isLoggedIn$ | async)">
      Login
    </a>
    <a class="router-link nav-item" (click)="onLogout()" *ngIf="isLoggedIn$ | async">
      Logout
    </a>
    

    【讨论】:

    • 完美运行!通常它会正常工作吗?但是因为我使用异步,所以我必须使用括号。
    • 是的,但是在这里您希望先应用管道,然后再应用否定:)
    • @SjaakvBrabant 用另一个可能的重构检查我的编辑 :)
    • 如果你使用&lt;ng-container&gt;它不会插入任何DOM节点。它将保持您的标记不变。它在这里可能没有什么不同,但在某些情况下会。例如,您可能将一些 css 样式应用于链接的父级,而那里的另一个 div 会搞砸。基本上&lt;ng-container&gt; 会在运行时消失,但您仍然可以使用 *ngIf、*ngFor 等来定位它:)
    • @TomaszKula 您的解决方案完美运行,除了重新加载页面。当我硬重新加载页面时,它最初会显示登录按钮,当页面将使用键盘或鼠标聚焦时,它将更新为注销。我可以理解观察者的初始值为false,所以会首先显示登录按钮。但是,您不认为一旦观察者的值更新,它就应该更新为 Logout 吗?你知道为什么会这样吗?
    【解决方案2】:

    你也可以重构使用 ngIf 指令的 else 部分:

    <a class="router-link nav-item" (click)="onLogout()" *ngIf="isLoggedIn$ | async; else loginBlock">
        Logout
    </a>
    <ng-template #loginBlock>
        <a class="router-link nav-item" routerLink="/login">
            Login
        </a>
    </ng-template>
    

    您可以在the docs 中查看更多示例。

    【讨论】:

    • 我不知道为什么,但之前我不明白。因为我看了文档但不明白。但是现在你已经在我的上下文中做到了,我理解它,我会记住这个解决方案。感谢您的帮助!
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2016-10-30
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    相关资源
    最近更新 更多