#javascript #angular #firebase #rxjs
#javascript #угловой #firebase #rxjs
Вопрос:
Я пытаюсь получить информацию из firebase и отфильтровать ее с помощью Rxjs 6.
У меня есть несколько вопросов по этому поводу:
- Я считываю объект по uid и получаю информацию. в этом объекте у меня есть избранное, и я пытаюсь отфильтровать из избранного только определенный uid. но я думаю, потому что его массив объектов я не могу фильтровать, поэтому я загружаю отдельно только избранное из firebase.
- когда я использую канал и фильтр, я получаю ошибку в ts. проблема в том, что свойство ‘uid’ не существует для типа ‘any[]’ . Я могу скомпилировать, только если использую // @ts-ignore. в любом случае, я ничего не получаю от rxjs.
- когда я использую map в фильтре, я получаю следующую проблему: data.favorite.filter не является функцией (в веб-консоли).
Структура базы данных:
profile{
NAg0E9IXrjeKMw3tLxPrlyvcdBr2{
name:david,
age:20,
favorite{
NHXL2LD5LIfgdfvr{
name:mike,
uid:gh4Q0OEfNHXL2LD5LIgFpVmdmm92
}
Q0OEfNHX2LD5Ldsdv{
name:ron,
uid:Vmdmm92dNHXL2LD5LIgFpEfNHXL2
}
}
}
gh4Q0OEfNHXL2LD5LIgFpVmdmm92{
name:mike,
age:26,
favorite{
rlyvcdBr25LdsIXrdv{
name:david,
uid:NAg0E9IXrjeKMw3tLxPrlyvcdBr2
}
}
}
}
сервисный код:
getDataObj(objpath:string){
this.objRef = this.db.object(objpath);
this.obj = this.objRef.valueChanges();
return this.obj;
}
getDataList(listpath:string){
this.itemsRef = this.db.list(listpath);
this.items = this.itemsRef.snapshotChanges().pipe(
map(changes =>
changes.map(c => ({ key: c.payload.key, ...c.payload.val() }))
)
);
return this.items;
код компонента:
//Here I get Problem 3
this.db.getDataObj("/Profile/" this.uid).pipe(
map(data => data.favorite.filter((res) => res.uid===this.uid))).subscribe(res=>console.log(res));
//Here I get Problem 2
this.db.getDataList("/Profile/" this.userAuth.uid "/favorite").pipe(filter(data => data.uid == this.uid)).subscribe(res => {
console.log(res)});
если я выполняю такой фильтр, у меня это работает:
this.db.getDataList("/Profile/" this.userAuth.uid "/favorite").subscribe(res => {
console.log(res.filter(names =>names.uid == this.uid));
console.log(res)});
Спасибо
Комментарии:
1. Поскольку вы используете typescript, вы можете попробовать фактически объявлять типы в своих объектах. Какие типы вы ожидаете на каждом шаге в ваших потоках?
2. Ваш
data
в массиве, он не имеет.uid
. Вы должны использоватьmap
вместоfilter
и использоватьfilter
внутриmap
.3. в любом случае, я получаю проблемные данные.uid не является функцией на карте