#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
ошибке в браузере Chrome2. Решение rest API может работать, когда нет аутентификации… В противном случае это может привести к сбою.