2017-10-09 3 views
1

AngularFire2を使用して、私は1つのFirestoreドキュメントからデータを取得しようとします。 どのような作品はです:私は一度だけのサブスクリプションのコードを実行したいAngularFire2 firestore take(1)on doc valueChanges

this.addressRef = afs.doc<Address>('addresses/key') 
this.addressRef.valueChanges().subscribe(val => {......} 

。通常は、これを達成するためにtake(1)を使用します(Firebase DBで動作します)。 しかし、このコード

this.addressRef.valueChanges().take(1).subscribe(val => {......} 

はエラーを与える:TypeError例外:。this.addressRef.valueChanges(...)を取る関数ではありません。

VSコードにはテイクアクションのリストがあります。これはAngularFire2のバグですか?これは間違っているのですか、データが取得された後にサブスクリプションを停止する他の(より良い)方法がありますか?私もトポロマイズを試みましたが、これも失敗しました。

答えて

3

次の操作を行うことでこれを実現することができます

this.userDoc = afDs.doc<User>('users/NaGjauNy3vYOzp759xsc'); 
this.userDoc.valueChanges() 
.take(1) 
.subscribe(v => { 
    this.user = v; 
}) 

私はあなたのためstackblitzを提供していますhttps://stackblitz.com/edit/angular-snnbwd

ジャストコードを表示するアプリ/ hello.component.tsに行きます。

+1

私は既に同じコードを使用していますが、私のセットアップではtake()は動作しませんしかし、あなたのstackblitzを勉強した後、私は私の輸入が異なることがわかりました。私は彼らがVCによって自動生成されたと思います。私は "rxjs/operator/take"をインポートパスとして持っていました。あなたの例のように "rxjs/add/operator/take"に変更し、今度はtake()が動作します。完全なコードを提供していただきありがとうございます。私はこれらの異なる道についてさらに研究します。 – majodi

+0

今、あなたは他のコードを書くためにuser.uidの例が必要になるたびに、subscribeの中でこれを行う必要がありますか?これにより、コードが奇妙でネストされたように見えます。あなたはデータベースから現在のユーザーのuidを取得できませんし、購読していないコンポーネント(htmlではありません)の中で何かしますか? – Ruben

+0

@Rubenあなたはまだこれについて助けが必要ですか?短い答えは、はい - あなたが購読しなければならないということです。しかし、あなたはそれを一回以上呼び出す必要はありません:) – DauleDK