2

Я разрабатываю приложение Angular2 с Firebase в качестве backend. На подстранице я хочу отобразить некоторые задания на заданную неделю, которые задаются параметром маршрута.Как правильно запросить список Firebase в AngularFire2?

Я использую 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$ наблюдаемыми не возвращается любые данные за данную неделю.

Я предположил, что после того, как weekId будет задан путем запроса параметров маршрута, список получит его как параметр запроса и вернет данные, которые имеют: { weekId: actualWeekId, ...}.

EDIT Добавлен пример данных, хранящихся в Firebase:

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

Так что я хочу сделать, это получить все записи для данного weekId

+0

Не могли бы вы также включить представление своих данных в вопрос? – cartant

+0

@cartant Я добавил примеры данных на вопрос. Спасибо за помощь! – paweloque

ответ

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 вы, вероятно, увидите консоль предупреждения о индексе - если вы еще не созданы. Для этого вам необходимо использовать правила безопасности. Это должно быть объяснено достаточно хорошо в документации.

+0

Отлично, теперь он работает! Я получаю предупреждение использовать '.indexOn' из соображений производительности. Где я должен это указать? – paweloque

+0

Я нашел его в разделе «Правила Firebase». – paweloque

5

Если кто-то с трудом, как я в настоящее время, это может помочь вам, ребята:

db.list('/items', ref => ref.orderByChild('size').equalTo('large')) 

Пожалуйста, обратитесь к https://github.com/angular/angularfire2/blob/master/docs/rtdb/querying-lists.md

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

+0

Вышеупомянутое решение для AngularFire2 версии 5 и выше! –

 Смежные вопросы

  • Нет связанных вопросов^_^