2

私はFirebaseをバックエンドとしてAngular2アプリケーションを開発しています。サブページでは、ルートパラメータで指定された週のタスクを表示します。AngularFire2でFirebaseのリストを正しく照会する方法は?

私は次のように照会AngularFire2へのパラメータとしてBehaviorSubjectを使用しています:ここで

export class PrepareComponent implements OnInit { 

    private routeSub: any; 
    weekId = ''; 

    private weekSubject: BehaviorSubject<any> = new BehaviorSubject('weekId'); 

    taskTemplates$: FirebaseListObservable<TaskTemplate[]>; 

    constructor(private route: ActivatedRoute, 
       private router: Router, 
       private angularFire: AngularFire) { 

     // this.taskTemplates$ = angularFire.database.list("/taskTemplates"); 

はFirebaseクエリです:

 this.taskTemplates$ = angularFire.database.list("/taskTemplates", { 
      query: { 
       equalTo: this.weekSubject 
      } 
     }); 
    } 

    ngOnInit() { 
     this.routeSub = this.route.params.map(
      (params: Params) => this.weekId = params[ 'weekid' ] 
     ).subscribe(
      weekId => this.weekSubject.next(weekId) 
     ); 
    } 

    ngOnDestroy() { 
     this.routeSub.unsubscribe(); 
    } 
} 

残念ながら、観測可能Firebase taskTemplates$が戻っていません指定されたweekIdのすべてのデータ。

weekIdが経路パラメータをクエリすることによって設定されると、リストはそれをクエリパラメータとして取得し、{ weekId: actualWeekId, ...}のデータを返すと想定しました。

{ 
    "-Kc_E0U4UOl9PPtxpzCM" : { 
    "description" : "asdfasdf", 
    "weekId" : "99f2" 
    }, 
    "-Kc_E3wv3fhpUt56sM4u" : { 
    "description" : "another task", 
    "weekId" : "99f2" 
    } 
} 

だから私は何をしたいのかコアの問題があるように思われる与えweekId

+0

あなたのデータの表現も質問に含めることができますか? – cartant

+0

@cartant質問にサンプルデータを追加しました。助けてくれてありがとう! – paweloque

答えて

2

のためのすべてのレコードを取得することです:

EDITはFirebaseに格納されるデータの例を追加しましたobservableリストが作成されたときに指定されたquery

データの構造を考えると、weekIdのエントリを選択したように見えるので、orderByChildが使用されているようです。

質問のコードのクエリは、有効化されたルートから取得したweekidに等しいキーを持つエントリを探します。ただし、キーは-Kc_E0U4UOl9PPtxpzCMのようなプッシュキーです。

有効なルートから直接観察可能なクエリを構成することによって、コードをいくらか簡略化することもできます。このような何かは、あなたが欲しいものを行う必要があります。

export class PrepareComponent implements OnInit { 

    taskTemplates$: FirebaseListObservable<TaskTemplate[]>; 

    constructor(
    private route: ActivatedRoute, 
    private router: Router, 
    private angularFire: AngularFire 
) {} 

    ngOnInit() { 
    this.taskTemplates$ = this.angularFire.database.list("/taskTemplates", { 
     query: { 
     orderByChild: 'weekId', 
     equalTo: this.route.params.map((params: Params) => params['weekid']) 
     } 
    }); 
    } 
} 

あなたがorderByChildを使用している場合、あなたはおそらくコンソールはインデックスについての警告が表示されます - あなたはすでに1を作成していないしている場合。そのためにはセキュリティルールを使用する必要があります。それはドキュメントで十分に説明されるべきです。誰もが、今日私のような苦労をしている場合、これはあなたたちを助けるかもしれない

+0

偉大な、それは今動作します!パフォーマンス上の理由から '.indexOn'を使用するよう警告が出ます。これをどこで指定する必要がありますか? – paweloque

+0

私はそれをFirebase Rulesセクションで見つけました。 – paweloque

関連する問題