Получить количество дочерних элементов для узла Firebase с помощью AngularFire2?

#angular #firebase #firebase-realtime-database #observable #angularfire2

#angular #firebase #firebase-база данных в реальном времени #наблюдаемый #angularfire2

Вопрос:

Мне нужно подсчитать количество дочерних узлов для нескольких поддеревьев в Firebase для отображения в представлении. Для контекста мое приложение подсчитывает пользователей на разных этапах процесса.

Мой корневой узел (этапы) имеет два поддерева (StageOne, stageTwo). Каждое поддерево содержит переменное количество дочерних узлов, которые мне нужно подсчитать и отобразить в представлении.

База данных:

 stages
|__stageOne
|  |__user1
|  |__user2
|
|__stageTwo
   |__user3
  

Компонент:

 stageObject: FirebaseObjectObservable<any>;

constructor(public af: AngularFire){
    this.stageObject = af.database.object('/stages');
}
  

Просмотр (не отображается)

 <h3>Stage 1 Count = {{ (stageObject | async)?.stages.stageOne.length }}</h3>
<h3>Stage 2 Count = {{ (stageObject | async)?.stages.stageTwo.length }}</h3>
  

Просмотр (как это должно выглядеть):

 Stage 1 Count = 2
Stage 2 Count = 1
  

Ответ №1:

Вы не можете получить количество с помощью AngularFire2 (без загрузки всех элементов), но вы можете использовать REST API:

 this.http.get('https://your-app-name.firebaseio.com/stages/stageOne.json?shallow=true')
  .map(response => response.json())
  .subscribe(items => Object.keys(items).length)
  

Использование shallow=true вернет только ключи для всех дочерних элементов для «выбранного» узла.


Если вы хотите загрузить их все, вы можете использовать list() :

 this.stageOneObject = af.database.list('/stages/stageOne');
  

или преобразовать объект в массив:

 this.stageOneObject = Object.keys(this.stageObject.stageOne)
                            .map(key => this.stageObject.stageOne[key]);
  

Комментарии:

1. Решение REST API приводит к net insufficient resources ошибке в браузере Chrome

2. Решение rest API может работать, когда нет аутентификации… В противном случае это может привести к сбою.