Как правильно запросить список Firebase в AngularFire2?
Я разрабатываю приложение Angular2 с Firebase в качестве бэкэнда. На подстранице я хочу отобразить некоторые задачи для данной недели, которые задаются параметром маршрута.
Я использую BehaviorSubject
в качестве параметра для запроса AngularFire2 следующим образом:
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$
observable не возвращает никаких данных для данного weekId.
Я предположил, что когда-то weekId
будет установлен путем запроса параметров маршрута, список получит его в качестве параметра запроса и вернет данные, которые имеют: { weekId: actualWeekId, ...}
,
РЕДАКТИРОВАТЬ Добавлен пример данных, хранящихся в Firebase:
{
"-Kc_E0U4UOl9PPtxpzCM" : {
"description" : "asdfasdf",
"weekId" : "99f2"
},
"-Kc_E3wv3fhpUt56sM4u" : {
"description" : "another task",
"weekId" : "99f2"
}
}
Так что я хочу сделать, чтобы получить все записи для данного weekId
2 ответа
Основная проблема, как представляется, заключается в query
это указывается при создании списка наблюдаемых.
Учитывая структуру данных, кажется, что orderByChild
это то, что следует использовать, так как вы, кажется, хотите выбрать записи, которые имеют определенный weekId
,
Запрос в коде вопроса будет искать записи, ключи которых равны 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
вы скорее всего увидите консольное предупреждение об индексе - если вы его еще не создали. Вы должны использовать правила безопасности, чтобы сделать это. Это должно быть достаточно хорошо объяснено в документации.
Если кому-то сейчас тяжело, как мне, это может помочь вам, ребята:
db.list('/items', ref => ref.orderByChild('size').equalTo('large'))
Пожалуйста, обратитесь к https://github.com/angular/angularfire2/blob/master/docs/rtdb/querying-lists.md
для дополнительной информации!