2

私はこれに夢中になっているので、私は聴衆に提出します。Angularfire2からの価値を引き戻す

Observableを返す必要があります。 最初にFirestoreを呼び出して配列を含むフィールドを取得し、配列の各値に基づいて一致するキーを取得したいとします。通常はかなり簡単です。

私はコンソールで何が起こっているのか正確に分かるので、データはここにありますが、なぜ彼らは決してビューに表示されません。私があきらめる前に、私は以下の無数のバリエーションを作った。

マイ・サービス - 提案が反映されるように編集されました。それでもコンストラクタで public agendaData: Observable<any>

[マイコンポーネント

getUserActivites() { 

    console.log(this.userId) 
    let array = [] 

    const agenda = this.afs.doc(`users/${this.userId}`).snapshotChanges() 

    agenda.subscribe(list => { 
     const data = list.payload.data().activities 
     data.map(event => { 
     const id = event 
     const dataRef = this.afs.doc(`activities/${event}`).valueChanges() 
     dataRef.subscribe(date => { 
      array.push(date) 
      console.log(array) //array log the expected data in an array of Object 
      return data 
     }) 
     }) 
    }) 
    return agenda 
    } 

を働いていない

this.agendaData = this.agenda.getUserActivites()

マイビュー

<div *ngFor="let item of agendaData | async "> 
{{ item.name }} 
</div> 
+0

こんにちは@Benoit。私は理解しているか分からない。あなたの問題は、アイテムの 'key'を表示できないということですか?またはすべてのデータ(例: 'item.name')?ファイアストアにはキーがないので、ファイアストアにはキーがありません。マップするには[snapshotChanges()メソッド](https://github.com/angular/angularfire2/blob/master/docs/firestore/collections.md#snapshotchanges)を使用して配列にインクルードする必要があります。 – Will

+0

私の問題は、データをまったく表示できないことです。このシナリオでは、キーは必要ありません。私はちょうど選択されたドキュメントのリストを取得したい。選択は 'list.payload.data()。activities'にホストされているキーに基づいて行われます – Benoit

+0

あなたの問題は、あなたがサブスクリプションからデータを返そうとしていることです。これはうまくいきません:) https://stackoverflow.com/question/39295854/angular-2-how-to-return-data-from-subscribe – Alex

答えて

0

getUserActivities =()=> {は動作しますか?

日付は観測可能ですか?

this.observableBooks = this.bookService.getBooksWithObservable();

getBooksWithObservable():Observable { 返すthis.http.get(this.url).map((res:Response)=> res.json());

申し訳ありませんご質問にお答えできない場合は、私は自分自身に問題が何であるかご存じですか?

1

1)subscribe()this.afs.....snapshotChanges()に忘れてしまったと思います。 PromiseとObservablesの違いの1つは、Observablesが怠け者であることです。作業を開始するには、Observablesを購読する必要があります。

2)キー/ IDが不要な場合は、使いやすいvalueChanges()を使用する必要があります。例(テストされていない):

getUserActivites() { 
    let agenda = [] //Created for logging only 

    let usersTask = this.afs.object(`users/${this.userId}`).valueChanges();  
    let myReturnTask = usersTask.subscribe(users => {   
     console.log('received users'); 
     users.map(user => {    
      const dataRef = this.afs.doc(`activities/${user.id}`).valueChanges() 

      dataRef.subscribe(date => { 
       agenda.push(date) //For logging purpose I created this array 
       console.log(agenda) //Here I see exactly what I want! 

       return date // Why date is not returned? 
      }) 
     }) 
    }) 

    return myReturnTask; 
} 
+0

ありがとう@Makah、次の 'dataRef'を要求する前に' payload'を読む必要があるので 'snapshotChanges()'を使う必要があります。 。上記のコードをあなたの提案で更新しますが、まだ動作していません。私のコンポーネントの 'this.agendaData = this.agenda.getUserActivites()'で受け取った値をどのようにチェクできますか? – Benoit

+0

@Benoit console.log()でデバッグしようとすると、あなたが得るものを参照してください。Observableを返すという理由で、同期的に検証することはできません。私はあなたに役立つコードを少し変更しました。 – Makah

+0

Firestoreのドキュメンテーションで新しく読み込まれた 'Cloud Firestoreは配列を格納できますが、配列メンバーのクエリや単一配列要素の更新はサポートしていません。単一の「アクティビティ」をホストする単一のコンポーネントを作成し、list.payload.data()。activitiesの配列に基づいてこれらの単一コンポーネントを作成することで、私の見解を再考します。 – Benoit

関連する問題