2017-08-21 8 views
0

私は角2を使用してアプリケーションを構築していますが、この問題が発生しました。 AJAX呼び出しを実行するとき、我々は通常、このような方法でそれらを呼び出す:*ngIf="showForm"を設定することにより:角度:ラムダでのコード実行はテンプレートに影響しません

http.post(this.baseUrl + url, data, { headers: headers}).subscribe(
    result => { 
     this.showForm = false; 
    }, 
    error => { 
     this.showForm = true; 
    } 
); 

showFormはすなわち、フォームを削除/追加する示しComponentの財産です。そのコードを実行すると、ajax呼び出しが成功するとフォームがDOMから削除され、呼び出しが失敗した場合はフォームが保持されます。これは正しい動作です。

FacebookログインAPIを実行すると、少し違っています。私はそのコードを実行するときのResponse.Statusが'conencted'ある(ユーザが既にFacebookにログインして、すでにアプリケーションにログインした状態で、

FB.getLoginStatus(response => { 
    if (response.status === 'connected') { 
     this.showForm = false; 
    } 
    else { 
     this.showForm = true; 
    } 
}); 

:チュートリアルは、前記の通り、コードは次のようでなければなりません)、コードは応答λ内にthis.showForm = false;を実行します。以前の動作に続いて、DOMからフォームを削除する必要があります。Chromeでデバッグしようとしましたが、this.showForm = true;が実際に実行されました。

問題は、そのコード行は実行されましたが、フォームは削除されませんでした。この正確なコードを2回または3回実行する場合にのみ、フォームは最終的に値の変更を認識し、それに応じてビューを調整します。これにより、ユーザが実際にサインインする前に、フェイスブックログインボタン(FB.getLoginStatus()と呼ぶ)を2回または3回クリックする必要があります。

これに修正はありますか?または、FB.getLoginStatus()を使用する私のやり方が間違っていましたか?私はここでいくつかの啓発が必要です。

EDIT: はのResponse.Statusが'conencted'ある場合、コードではなく、私が以前に書いたthis.showForm = true;の、this.showForm = false;を実行されます間違って実行されるコードを、修正。

+0

実際には接続されています。デバッガは 'if'ブロックを踏んだ。問題は、私が検出した接続が接続されているかどうかではありません。フラグが反転されていても、ビューはリフレッシュされませんでした。これは@Adam Szmydが答えたものです。 – Kurotsuki

答えて

1

あなたは何かを台無しにしてしまったと思います。

私がこのコードを実行したとき、ユーザーがすでにFacebookにログインし、すでにアプリケーションにサインインしている状態(response.statusが 'conencted')でコードが実行されます。 showForm = true;

実際には最初のブロックを実行する必要があります。したがってthis.showForm = falseとなり、*ngIf="showForm"の場合はフォームを非表示にする必要があります。

変数が適切に設定されている(コードの適切な部分が実行されているが)ビュー自体が更新されていない場合は、手動でビューを更新しようとするとよいでしょう。 Facebookの非同期コールバックのため。

this answerを確認して、角度検出を手動で実行する方法を確認してください。

+0

ああ...右。 'this.showForm = false'を実行します。問題を修正しました。頭をアップしていただきありがとうございます。私はその参照を見てみましょう。それがうまくいくなら、私はこれを答えにします。 – Kurotsuki

+0

私は答えを読んだ。それは 'NgZoneと思われる。手動検出が実装されているかどうかを確認する方が簡単だったため、run()は人間が読めるようになりました。しかし、 'ChangeDetectorRef.detectChanges()'は、1行追加するだけで済むので簡単です。だから、サイドノートには、どちらが良いですか? 'NgZone.run(コールバック)'または 'ChangeDetectorRef.detectChanges()'? – Kurotsuki

+0

私は 'ChangeDetectorRef.detectChanges()'だけをこのコンポーネント(内部状態変数)の変更として言います。しかし、手動で検出する前に、コールバックに適切な 'showForm'値を入れて動作しないようにしてください –

関連する問題