AngularFire2使用其他firebase表中的外键进行查询、联接或筛选
我有这个firebase数据结构AngularFire2使用其他firebase表中的外键进行查询、联接或筛选,firebase,firebase-realtime-database,firebase-storage,angularfire2,Firebase,Firebase Realtime Database,Firebase Storage,Angularfire2,我有这个firebase数据结构 { members: { m1: { lastName: "smith", firstName: "john" }, m2: { lastName: "abc", firstName: "mike" } }, userFavs: { u1: { m1:true }, u2: { m2:true } } } 在我的服
{
members: {
m1: {
lastName: "smith",
firstName: "john"
},
m2: {
lastName: "abc",
firstName: "mike"
}
},
userFavs: {
u1: {
m1:true
},
u2: {
m2:true
}
}
}
在我的服务中,我有以下方法:
getMembers(): FirebaseListObservable<any[]> {
return this.af.database.list('/members',{
query: {
orderByChild: 'firstName'
}
});
}
搜索成员的工作正常。现在我在搜索栏下方添加了两个按钮,All和收藏夹。用户可以在其收藏夹中添加成员。在搜索中,应用程序需要能够使用用户收藏夹中存在的成员密钥筛选结果
如何添加userFavs节点中存在的成员密钥的附加筛选器?我通过获取userFavs密钥数组添加了附加筛选器。因此,在我的用户服务中,我有一个方法:
getUserFavKeys(){
let favKeys = [];
const userKey = this.authService.getActiveUser().uid;
let url = `/userCircles/${userKey}`;
this.af.database.list(url, { preserveSnapshot: true})
.subscribe(itemKeys=>{
itemKeys.forEach(itemKey => {
//console.log(itemKey.key);
favKeys.push(itemKey.key);
});
})
return favKeys;
}
然后在componentngOnInit
方法中,我初始化了密钥数组:
this.favKeys = this.userSvc.getUserFavKeys();
选择圆时:
onCirclesSelected(){
this.searching = false;
this.members = this.membersSvc.getMembers()
.map((members) =>
members.filter(member => this.userCircles.indexOf(member.$key) !== -1)
);
if (this.searchTerm == null || this.searchTerm == ''){
//do nothing
}else{
//filter w the search text
this.members = this.members
.map((members) =>
members.filter(member => member.lastName.toLowerCase().indexOf(this.searchTerm.toLowerCase()) !== -1 || member.firstName.toLowerCase().indexOf(this.searchTerm.toLowerCase()) !== -1));
}
}
希望这对任何需要相同搜索功能的人都有帮助。您在这里似乎没有提出问题或出现错误。@Kato谢谢!我用问题更新了它。让url=
/userCircles/${userKey}
;这是否必须与一个函数绑定?您能否详细说明您的问题?ThnxUserKey是一个动态值,对吗?这就是你们在不同路径之间切换的方式,我正在努力找到一条动态路径的最佳方式。是的。再看看那段代码,我可以写为let url=`/userCircles/${this.authService.getActiveUser().uid}`
以避免使用const userKey
声明。我在离线librabry中尝试了这一点,但一直失败。它不会接受的,你用过那个包装纸吗?
onCirclesSelected(){
this.searching = false;
this.members = this.membersSvc.getMembers()
.map((members) =>
members.filter(member => this.userCircles.indexOf(member.$key) !== -1)
);
if (this.searchTerm == null || this.searchTerm == ''){
//do nothing
}else{
//filter w the search text
this.members = this.members
.map((members) =>
members.filter(member => member.lastName.toLowerCase().indexOf(this.searchTerm.toLowerCase()) !== -1 || member.firstName.toLowerCase().indexOf(this.searchTerm.toLowerCase()) !== -1));
}
}