2017-01-01 10 views
2

ngIfが正しく評価される正しい表現が見つからないようです。Angular2 ng DOMを更新していない場合は、

私は単純なAngularfire2 example hereに従っており、ログインして正しくログアウトすることができます。

import { Component } from '@angular/core'; 
import { AngularFire } from 'angularfire2'; 

@Component({ 
    selector: 'app-root', 
    template: ` 
    <div> {{ (af.auth | async)?.uid }} </div> 
    <button (click)="login()">Login</button> 
    <button (click)="logout()">Logout</button> 
    `, 
}) 
export class AppComponent { 
    constructor(public af: AngularFire) { 
    this.af.auth.subscribe(auth => console.log(auth)); 
    } 

    login() { 
    this.af.auth.login(); 
    } 

    logout() { 
    this.af.auth.logout(); 
    } 
} 

私は状態に応じてログインし、正しいボタンを表示/非表示するコードを変更したいです。コンソールでは、認証がヌルからオブジェクトおよびバックに切り替わっていますが、DOMは更新されていないことがわかります。

<div> {{ (af.auth | async)?.uid }} </div> 
<button *ngIf="!(auth | async)" (click)="login()">Login</button> 
<button *ngIf="auth | async" (click)="logout()">Logout</button> 

は私が間違って何をやっている:ここで

は、最新の試みですか?これを正しく評価するにはどうすればよいですか?

+0

を理解するためにAsyncPipesafe navigation operator (?.)を探すべきだと思います。ブーリアン変数をクラス内で作成し、サブスクライバで設定し、ngIf句で参照してボタンを非表示/表示する方がよいでしょう。 –

+1

ブール値を返していますか? authのconsole.logは何を表していますか? – deek

+0

@deek authはオブジェクトです。ボタンがクリックされると、ログに「null」またはプロパティを持つ有効なオブジェクトが表示されます。 –

答えて

1

EDIT:loginlogoutの方法で変更されたログイン状態に登録していないので、メソッドにthis.af.auth.subscribe(auth => this.auth = auth);を追加する必要があります。

私はAngularfireに精通していませんが、...認証がnullから切り替わっている場合は、それを保存して使用できます。

<button *ngIf="auth == null" (click)="login()">Login</button> 
<button *ngIf="auth != null" (click)="logout()">Logout</button> 

は多分これが最善の方法ではありません。あなたが加入したとき、あなたは、あなたがちょうどそうのようにそれを使用することができ、auth => this.auth = auth代わりのconsole.logを購読することができ例えば、それを保管してください。 isLoggedのようなブール値を作成し、ボタンを表示/非表示にすることもできます。

確かに、これを行うにはより良い方法があるでしょう...しかし、少なくともここにはオプションがあります。

+0

私もこの方法で試しましたが、うまくいきません。それは正しいでしょうか? –

+0

そうです。ちょうど良い夜の睡眠の後にあなたのコードを見るときに気づいただけで、ボタンをクリックするとどこにでもあなたの変更を購読しますか?つまり、ページに移動するときにコンストラクタに登録するだけです...ログインしていないときにログインボタンをクリックすると、変更されたログインステータスに登録されていないため、ボタンステータスも変更されません。それとも今私は何かを誤解していますか? – Alex

+0

私はブール値を追加し、authのサブスクライブで私は値を変更し、今すぐ動作し、あなたのソリューションに似ています(サブスクリプションに基づいてローカルを変更します)。 @MeteCantimurも同様の提案をしました。ありがとう。 –

0

私はあなたがHTMLテンプレートからサブスクライブ機能に**認証**パラメータを参照することはできません(af.auth | async)?.uid表現

template: ` 
<div [ngSwitch]="(af.auth | async)?.uid"> 
<button *ngSwitchCase="null" (click)="login()">Login</button> 
<button *ngSwitchDefault (click)="logout()">Logout</button> 
</div>` 
+0

ngSwitchを使用することについて興味深い考え方ですが、authが有効なオブジェクトである場合は、上記は機能しません。これは正しいテストですか? '(af.auth | async)?uid'を'(af.auth | async).uid'に置き換えると、 –

+0

は動作しますか? –

+0

いいえ、まだ動作しません。しかし、非同期で安全なオペレータへの参照に感謝します。私は先に進み、AJT_82の答えを受け入れました。乾杯。 –

関連する問題