Как правильно запросить список 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

для дополнительной информации!

Другие вопросы по тегам