Lea*_*day 5 angularfire2 angular
我搜索过,但仍然无法得到正确的答案.我很高兴你指出了正确的方向.
我有一个包含用户和项目的数据库
pojects:
08177a0acb3f4d96f8cb5fa19002d2ed:
pid: 08177a0acb3f4d96f8cb5fa19002d2ed,
pName: "Prject 1"
uId: "254",
createdAt: 9377476
users:
254:
userName: "Eric"
uId: "254"
avatar: "image.jpg"
Run Code Online (Sandbox Code Playgroud)
现在我想显示我的项目,我在我的服务中检索列表
this.projectList = this.af.database.list('projects', {
query: {
orderByChild: 'createdAt'
}
});
getProjects() {
return this.projectList.map(snapshot => {
return snapshot;
});
Run Code Online (Sandbox Code Playgroud)
我订阅了component.ts
this.projectService.getProjects()
.subscribe(projects => this.projects = projects);
Run Code Online (Sandbox Code Playgroud)
我想要做的是从用户获取userName并使用项目显示它.
如何在项目中使用uId字段将用户列表中的用户信息检索到一个列表中,以便显示ie {{project.userName}} {{project.avatar}}?
您可以使用它forkJoin来获取项目的用户,并可以使用其结果选择器将所需的属性复制到发出的项目对象中:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/forkJoin';
import 'rxjs/add/operator/first';
import 'rxjs/add/operator/switchMap';
// Compose an observable based on the projectList:
this.projectWithUserList = this.projectList
// Each time the projectList emits, switch to unsubscribe/ignore
// any pending user queries:
.switchMap(projects => {
// Map the projects to the array of observables that are to be
// joined.
let userObservables = projects.map(project => this.af.database
.object(`users/${project.uId}`)
.first()
);
// Join the user observables, and match up the users with the
// projects, etc.
return userObservables.length === 0 ?
Observable.of(projects) :
Observable.forkJoin(...userObservables, (...users) => {
projects.forEach((project, index) => {
project.userName = users[index].userName;
project.avatar = users[index].avatar;
});
return projects;
})
});
Run Code Online (Sandbox Code Playgroud)
每当数据库中的项目发生更改时,上述实现都将发出一系列项目,但如果用户信息发生更改,则不会发出数组.
如果要在项目或用户信息更改时发出数组,则可以使用combineLatest而不是forkJoin为用户使用:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/combineLatest';
import 'rxjs/add/operator/switchMap';
// Compose an observable based on the projectList:
this.projectWithUserList = this.projectList
// Each time the projectList emits, switch to unsubscribe/ignore
// any pending user queries:
.switchMap(projects => {
// Map the projects to the array of observables that are to be
// combined.
let userObservables = projects.map(project => this.af.database
.object(`users/${project.uId}`)
);
// Combine the user observables, and match up the users with the
// projects, etc.
return userObservables.length === 0 ?
Observable.of(projects) :
Observable.combineLatest(...userObservables, (...users) => {
projects.forEach((project, index) => {
project.userName = users[index].userName;
project.avatar = users[index].avatar;
});
return projects;
});
});
Run Code Online (Sandbox Code Playgroud)