2016-10-04 6 views
5

状況:FirebaseObjectObservableを使用して、Ionic 2(rc0)テンプレートを作成しています。テンプレートコード:ObservableをAngular2クリック関数内でAsyncパイプで使用する方法

<p>{{(course | async)?.description}}</p> 
<button ion-button dark full large (click)="openDeckOnBrowser(course.deckUrl)"> 
    <ion-icon name='cloud-download'></ion-icon> 
    <div>View Deck</div> 
</button> 

TSファイルが

this.course = this.af.database.object('/bbwLocations/courses/' + courseId); 

this.courseでは、観察可能Firebaseオブジェクトです。 (click)= "openDeckOnBrowser(course.deckUrl)。course.deckUrlが空のため、値を関数に渡すことはできません。

Tho only hacky way I

<button id="{{(course | async)?.deckUrl}}" ion-button dark full large (click)="openDeckOnBrowser($event)"> 
    <ion-icon name='cloud-download'></ion-icon> 
    <div id="{{(course | async)?.deckUrl}}">View Deck</div> 
</button> 

し、Clickイベントに:?

openDeckOnBrowser(event):void { 
    console.log(event); 
    let target = event.target || event.srcElement || event.currentTarget; 
    let idAttr = target.attributes.id; 
    let url = idAttr.nodeValue; 
    console.log (url); 
    } 

しかし、これにアプローチする公式と簡単な方法

+0

解決策は見つかりましたか?私はこれを踏みにじっている。 –

答えて

1

ちょうどあなたの中に観察を購読するこれまでのところ、これはされて回避することが判明コード、およびコンポーネントにコース自体を格納します。

this.af.database.object('/bbwLocations/courses/' + courseId) 
    .subscribe(course => this.course = course); 

を次に、あなたに表示します。

<p>{{ course?.description }}</p> 
<button ion-button dark full large (click)="openDeckOnBrowser(course?.deckUrl)"> 

(私はおそらくNG-場合にのみ使用しますが、コースがあり一度説明とボタンを表示利用可能)

+1

オブジェクトをうまく購読すると、Firebase Observableプロジェクト全体のポイントを奪います。非同期パイプを使用してコードを購読して最適化し、終了時に購読を停止します。それで、私のためにたくさんのコードを単純化します。あなたの解決策では、ビューが破棄され、パイプが私のためにできなかった他のすべてのクリーニングジョブが終了したら、私は退会する必要があります。 firebaseオブジェクトを手動で購読する必要がないソリューションを探しています。 –

+0

さて、幸運にて... –

6

テンプレートでは、(click)="openDeckOnBrowser(course.deckUrl)"は、テンプレートが解析されるとすぐに評価されます。ここでは非同期パイプを使用しないため、deckUrlは空です。あなたは第二非同期パイプを追加することによってこの問題を解決することができます

<p>{{(course|async)?.description}}</p> 
<button ... (click)="openDeckOnBrowser((course|async).deckUrl)">...</button> 

2つのサブスクリプションが作成されます。しかし、これはいいではありません。

A(良い)代替:

公式docs on the AsyncPipe常に出力する項目のリストではなく*ngIf出力に単一の項目を*ngForを使用しています。理由は簡単です:*ngIfディレクティブは割り当てを許可しません。しかし、我々は、この制限を回避することができます

<div *ngFor="let course of course$|async"> 
    <p>Course: {{course?.name}}</p> 
    <p>Url: {{course?.url}}</p> 
</div> 

を、コンポーネントに、我々は1つだけのコースのリストにコースをマッピングします:

this.getCourse().map(c=>[c]); 
次のように

テンプレートが見えます

See working Demo in Plunker

+0

私はPlunkerに対する私の最近の変更が昨日保存されなかったことに気づいた。私はそれを修正し、今それはすべて正しいはずです。 –

+0

私は解決策を試しましたが、まだ空に戻ります... –

+0

[回答で参照されている[Plunker](http://plnkr.co/edit/seROehx78RV009XjLYy4?p=preview) 。 Plunkerにあなたの役に立っていない解決策を投稿することができれば、私はあなたを手伝ってうれしく思います。そうでなければ、どこに障害があるのか​​判断できません。 –

関連する問題