2017-01-18 5 views
1

Angular 2で観測可能なプログラミングを学ぼうとしますが、重要な点は1つもありません。 (TSファイル内のオブザーバブルをサブスクライブせず、オブザーバブル値をメンバ変数に変えずに)テンプレートレベルでイベントをクリック(クリック)します。Angular2のオブザーバブル(クリック)ハンドラ内で値を渡す方法

Firebaseの専門家の多くは、「可能な限り、angular2でasyncを使用して、手動での定期購読を防ぐようにしてください! - タスク$を手動で購読して配列に変換したくない理由。例えば

:私はコンポーネントの私のTSファイルでこれを持って

import {Task} from "../model/task"; 
constructor(private db:AngularFireDatabase, @Inject(FirebaseRef) fb) { 
    this.sdkDb = fb.database().ref(); 
} 

findTaskById(id:string):Observable<Task> { 

    return this.db.object('tasks/' + id).map(task => Task.fromJson(task)); 

} 
:私のサービスで

task$: Observable<Task>; 

this.task$ = this.tasksService.findTaskById(taskId); 

、これは、観察を返すAngularFireでfirebaseを呼び出すためのコードです

私のテンプレートでは、Angular2の値をasync pipeで問題なく使用できます。

<md-card-title>{{(task$ | async)?.title}}</md-card-title> 

しかし、私はそうのように、このタスク$内の$ id値を必要とするボタンがあります。これはクリックとして動作しません

<button md-button *ngIf="(authInfo$ | async)?.isLoggedIn()" (click)="deleteTask((task$ | async)?.$key)">Delete</button> 

は、式の中のパイプを許可していません...そしてIタスク$を購読してメンバ変数にするのは避けてください(RXJSプログラミングのためにタスク$を維持するベストプラクティス?)

$ keyの値は最初は存在しません。私は非同期パイプを使用できません!

+1

サービスを表示できますか?ここでtasksService.findTaskById(taskId)が呼び出されますか? – Everett

+0

こんにちは@pezetter!サービスコールを追加しました。それは基本的にangularFire2観測可能です。タスク$は正常に動作しています。それは非同期パイプを許可しない(クリックする)問題です。私はそれを避け、購読を使用しない方法は知らない。 –

+0

非同期パイプの目的は何ですか?コンポーネントはタスクを定義し、最終的にコンポーネントのメソッド(deleteTask)を呼び出すため、なぜ$をdeleteTask $に渡す必要がありますか? deleteTaskメソッドで直接使用するのはなぜですか? – JSF

答えて

2

問題を解決する方法は、ボタンの変数を作成し、その値をハンドラに渡すことです。またObservableはvalueプロパティにバインドされています。何にクリックハンドラを追加する一般的なケースだけではなく、<button>については

<button type="button" #item value="{{i$ | async}}" (click)="buttonClicked(item.value)">BUTTON</button> 
4

、あなたは約束/観察可能なストリームの最新の値を保持するために隠された<input>要素を使用して、他からその値にアクセスすることができます要素。

<input #dummy style="display: none" type="text" value="{{ myAsyncSource | async }}"> 
    <a (click)="myFunction(dummy.value)">{{ dummy.value }}</a> 
関連する問題