2

Ich entwickle eine Angular2-Anwendung mit Firebase als Backend. Auf einer Unterseite möchte ich einige Aufgaben für eine bestimmte Woche anzeigen, die durch einen Routenparameter spezifiziert sind.Wie kann man eine Firebase-Liste in AngularFire2 richtig abfragen?

Ich bin ein BehaviorSubject als Parameter an die AngularFire2 die folgende Art und Weise abfragen mit:

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"); 

Hier ist die Firebase Abfrage:

 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(); 
    } 
} 

Leider ist die Firebase taskTemplates$ beobachtbar ist nicht zurückkehren irgendwelche Daten für die gegebene weekId.

Ich nahm an, dass sobald die weekId durch Abfrage der Route Parameter gesetzt wird, würde die Liste es als Abfrageparameter erhalten und die Daten zurückgeben, die: { weekId: actualWeekId, ...}.

EDIT Hinzugefügt ein Beispiel von Daten in Firebase gespeichert:

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

Also, was ich tun möchte, ist, alle Datensätze für ein bestimmtes weekId

+0

Können Sie auch eine Darstellung Ihrer Daten in die Frage einfügen? – cartant

+0

@cartant Ich habe der Frage Beispieldaten hinzugefügt. Danke fürs Helfen! – paweloque

Antwort

2

Das Kernproblem scheint zu bekommen zu sein die query, die angegeben wird, wenn die Liste Observable erstellt wird.

Angesichts der Struktur der Daten scheint es, dass orderByChild ist, was verwendet werden sollte, wie Sie scheinen, die Einträge, die eine bestimmte haben weekId haben.

Die Abfrage im Code der Frage sucht nach Einträgen, deren Schlüssel der weekid entspricht, die von der aktivierten Route erhalten wird. Die Tasten sind jedoch Tasten wie -Kc_E0U4UOl9PPtxpzCM.

Sie können den Code auch etwas vereinfachen, indem Sie die Query Observable direkt aus der aktivierten Route zusammensetzen. So etwas sollte tun, was Sie wollen:

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']) 
     } 
    }); 
    } 
} 

Wenn Sie orderByChild verwenden, werden Sie wahrscheinlich eine Konsole sehen über einen Index Warnung - wenn Sie noch nicht bereits eine erstellt. Sie müssen dazu die Sicherheitsregeln verwenden. Es sollte in der Dokumentation gut genug erklärt werden.

+0

Großartig, es funktioniert jetzt! Ich erhalte eine Warnung, um '.indexOn' aus Leistungsgründen zu verwenden. Wo muss ich das angeben? – paweloque

+0

Ich habe es gefunden, es ist in der Firebase-Regeln Abschnitt. – paweloque

Verwandte Themen