我正在使用firebase构建Angular登录应用,并且尝试在组件中订阅用户Observable,如下所示:
export class UserEditComponent implements OnInit {
constructor(public authService: AuthService) {}
ngOnInit() {
this.authService.user.subscribe(user => {
console.log(user);
});
}
}
这是AuthService中定义的可观察值:
export class AuthService {
public user: Observable<firebase.User>;
constructor(public auth: AngularFireAuth) {
this.user = auth.authState;
}
}
这在我的html模板中很好用,每次用户数据更新时,以下列表都会正确更新:
<ul>
<li><strong>name:</strong> {{ (authService.user | async)?.displayName }}</li>
<li><strong>email:</strong> {{ (authService.user | async)?.email }}</li>
<li><strong>phone:</strong> {{ (authService.user | async)?.phone }}</li>
</ul>
我的问题是我的订阅功能仅运行一次。仅在启动时,用户对象才会记录到控制台。我尝试将代码从ngOnInit
移到构造函数,但结果是相同的。每次更新用户时,是否都不应将新的用户对象记录到控制台?
我已经仔细研究了问题AngularFire Observables / Subscribe - Not Setting Class Variable in Same Scope,但是由于我正在组件中进行订阅而不是在服务中进行操作,所以我看不到它如何适用于我的代码。
*更新*
现在我想知道这是某种错误还是版本控制问题。我用以下代码替换了AuthService
代码:
export class AuthService {
public user: Observable<any>;
constructor(public auth: AngularFireAuth) {
this.user = Observable.create(function (observer) {
setInterval(() => observer.next(new Date().toString()), 1000 );
});
}
}
这很好用,这向我暗示,该问题与火力地堡提供的特定可观察物有所关系。不过,不知道该怎么办。我能想到的一切都是骇人听闻的。
*更新2 *
似乎正在发生的事情是,即使没有调用next
函数,底层的用户值也正在更新。我不确定为什么会这样。我将ngOnInit
更改为以下内容:
export class UserEditComponent implements OnInit {
public userCurrent: firebase.User;
constructor(public authService: AuthService) {}
ngOnInit() {
obj = this;
this.authService.user.pipe(first()).subscribe(user => {
obj.userCurrent = user;
});
}
}
userCurrent
对象的值保持更新。我不知道发生了什么,但是它可以满足我的需求。