Angular ngIf firebase 身份验证指令使 DOM 无响应

Posted

技术标签:

【中文标题】Angular ngIf firebase 身份验证指令使 DOM 无响应【英文标题】:Angular ngIf firebase authentication directive makes DOM unresponsive 【发布时间】:2018-10-22 20:21:41 【问题描述】:

我正在使用 Angular 的 *ngIf 指令来检查用户当前是否已登录。根据用户的身份验证状态(我正在使用 Firebase 身份验证),应该显示登录按钮或用户菜单。代码如下:

.html

<div class="right-side">
    <!-- Header Widget -->
    <div class="header-widget">

    <!-- User Menu -->
    <div class="user-menu" *ngIf="afAuth.authState | async as user; else showLogin">
        <div class="user-name"><span><img src="assets/images/agent-03.jpg" ></span>Hi,  ... !</div>
        <ul>
            <li><a routerLink="my/profile"><i class="sl sl-icon-user"></i> My Profile</a></li>
            <li><a routerLink="my/bookmarks"><i class="sl sl-icon-star"></i> Bookmarks</a></li>
            <li><a routerLink="my/properties"><i class="sl sl-icon-docs"></i> My Properties</a></li>
            <li (click)="logOut()"><a routerLink="/"><i class="sl sl-icon-power"></i> Log Out</a></li>
        </ul>
    </div>

    <ng-template #showLogin>
        <a routerLink="/login-register" class="sign-in"><i class="fa fa-user"></i> Log In / Register</a>
    </ng-template>

    <a routerLink="/submit-property" class="button border">Submit Property</a>
    </div>
    <!-- Header Widget / End -->
</div>

.ts

import  AngularFireAuth  from 'angularfire2/auth';
// ...
@Component(
  // ...
)
export class AppComponent 
  constructor(public afAuth: AngularFireAuth) 
  

点击后,用户菜单应弹出并显示链接列表。但是,单击时没有响应。This is the template I'm using。这是菜单 ul 的 .css 代码:

.css

.user-menu ul 
    float: left;
    text-align: left;
    position: absolute;
    top: 45px;
    right: 0;
    list-style: none;
    background-color: #fff;
    box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.12);
    border-radius: 4px;
    display: inline-block;
    width: 190px;
    font-size: 15px;
    transform: translate3d(0,15px,0);
    padding: 16px 8px;
    box-sizing: border-box;
    transition: 0.25s;
    visibility: hidden;
    opacity: 0;
    z-index: 110;

如果我像 &lt;div class="user-menu" *ngIf="1==1; else showLogin"&gt; 那样替换 *ngIf 指令中的代码,则 DOM 会响应:

但是当我监控用户的身份验证状态*ngIf="afAuth.authState | async as user; else showLogin" 时,它一直没有响应。

如何解决?

【问题讨论】:

尝试将构造函数更改为:user: Observable;构造函数(公共 afAuth:AngularFireAuth) this.user = afAuth.authState; 然后保持在 html 上, *ngIf="user | async; else showLogin" 代码看起来没问题。您确定 firebase 设置没有问题吗? 【参考方案1】:

将此行添加到类中

user$: Observable<firebase.user>;
    constructor(private afAuth: AngularFireAuth)
    this.user$ = afAuth.authState
    

在HTML里面写

<div *ngIf="user$ | async as user; else showLogin">

【讨论】:

以上是关于Angular ngIf firebase 身份验证指令使 DOM 无响应的主要内容,如果未能解决你的问题,请参考以下文章

如何在angular4的firebase电话身份验证中重新发送短信验证?

typescript 使用OAuth,匿名和电子邮件/密码的Angular4 Firebase身份验证服务。专为Angular中引入的更改而设计

Angular *ngIf 内存使用情况

Angular2 动画不适用于 ngIf

在 Angular 2 中使用没有额外元素的 ngIf

我们如何在 Angular 中为 *ngIf 添加过渡效果?