未显示用户信息
User information not being displayed
我有一个案例,我使用管道显示一些用户信息:
{{ author.id | user: 'name' }}
我从作者那里得到 id
,然后,我使用 user
管道获取其存储在 /users/$uid
中的信息。这是我的烟斗:
export class UserPipe implements PipeTransform {
constructor(private af: AngularFire) {}
transform(uid: string, field: any): any {
let data = {};
let fb = this.af.database.object(`/users/${uid}`);
fb.subscribe(res => {
data = res;
console.log(data[field]);
});
return data[field];
}
}
如果作者是当前登录的用户,这可以正常工作。但是,不会为其他人显示该名称。
该名称已正常打印在控制台中,但仍未显示在 HTML 中。我还仔细检查了 Firebase 的安全规则,没问题。我在控制台中没有收到任何错误。
您的 transform()
函数使用了一个可观察对象。如果您想将映射逻辑合并到管道中,最简单的方法是用 AsyncPipe
包装您的结果。
@Pipe({
name: 'user',
pure: false
})
export class UserPipe implements PipeTransform {
private asyncPipe: AsyncPipe;
constructor(ref: ChangeDetectorRef, private af: AngularFire) {
this.asyncPipe = new AsyncPipe(ref);
}
transform(uid: string, field: any): any {
let fb = this.af.database.object(`/users/${uid}`).map(res => res[field]);
return this.asyncPipe.tranform(fb);
}
}
或者如果你想在一个组件中实现这个功能,虽然不推荐,只是为了好玩
@Component({
selector: 'my-user',
template: '{{ result | async }}'
})
export class UserComponent {
@Input() uid: string;
@Input() field: string;
result: Observable<any>;
constructor(private af: AngularFire) {}
ngOnChanges(changes: SimpleChanges) {
let field = changes.field.currentValue;
let uid = changes.uid.currentValue;
if (uid && field) {
this.result = this.af.database.object(`/users/${uid}`).map(res => res[field]);
}
else {
this.result = Observable.of(null);
}
}
}
将其用于:
<my-user uid="12345" field="name"></my-user>
或者,您可以按照评论中的建议进行操作,只需 return this.af.database.object('/users/uid')
并将结果用 async
管道传递。
我有一个案例,我使用管道显示一些用户信息:
{{ author.id | user: 'name' }}
我从作者那里得到 id
,然后,我使用 user
管道获取其存储在 /users/$uid
中的信息。这是我的烟斗:
export class UserPipe implements PipeTransform {
constructor(private af: AngularFire) {}
transform(uid: string, field: any): any {
let data = {};
let fb = this.af.database.object(`/users/${uid}`);
fb.subscribe(res => {
data = res;
console.log(data[field]);
});
return data[field];
}
}
如果作者是当前登录的用户,这可以正常工作。但是,不会为其他人显示该名称。
该名称已正常打印在控制台中,但仍未显示在 HTML 中。我还仔细检查了 Firebase 的安全规则,没问题。我在控制台中没有收到任何错误。
您的 transform()
函数使用了一个可观察对象。如果您想将映射逻辑合并到管道中,最简单的方法是用 AsyncPipe
包装您的结果。
@Pipe({
name: 'user',
pure: false
})
export class UserPipe implements PipeTransform {
private asyncPipe: AsyncPipe;
constructor(ref: ChangeDetectorRef, private af: AngularFire) {
this.asyncPipe = new AsyncPipe(ref);
}
transform(uid: string, field: any): any {
let fb = this.af.database.object(`/users/${uid}`).map(res => res[field]);
return this.asyncPipe.tranform(fb);
}
}
或者如果你想在一个组件中实现这个功能,虽然不推荐,只是为了好玩
@Component({
selector: 'my-user',
template: '{{ result | async }}'
})
export class UserComponent {
@Input() uid: string;
@Input() field: string;
result: Observable<any>;
constructor(private af: AngularFire) {}
ngOnChanges(changes: SimpleChanges) {
let field = changes.field.currentValue;
let uid = changes.uid.currentValue;
if (uid && field) {
this.result = this.af.database.object(`/users/${uid}`).map(res => res[field]);
}
else {
this.result = Observable.of(null);
}
}
}
将其用于:
<my-user uid="12345" field="name"></my-user>
或者,您可以按照评论中的建议进行操作,只需 return this.af.database.object('/users/uid')
并将结果用 async
管道传递。