angular - AngularFire 订阅在我的组件中只触发一次,但在我的 html 模板中工作正常
问题描述
我正在使用 firebase 构建一个 Angular 登录应用程序,并且我正在尝试在我的组件中订阅用户 Observable,如下所示:
export class UserEditComponent implements OnInit {
constructor(public authService: AuthService) {}
ngOnInit() {
this.authService.user.subscribe(user => {
console.log(user);
});
}
}
这是 AuthService 中定义的 observable:
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 );
});
}
}
这很好用,这向我表明问题出在 firebase 提供的特定 observable 上。不过,不知道该怎么做。我能想到的一切都是hacky。
* 更新 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
保持更新。我不知道发生了什么,但它可以满足我的需要。
解决方案
推荐阅读
- django - 如何在 Django URL 中正确重定向,我在重定向时遇到问题
- python - N阶差和N阶差
- terraform - 使用 Terraform 将 Helm 部署到 GKE 时经常出错
- javascript - 搜索html表格
- c++ - C++程序产生异常?
- swift - 使用 Xcode 11.4.1,为什么这些错误显示在动画部分?
- javascript - Node.js + Express + i18next 如何同时管理两种语言
- c# - 是否可以在 C# 中使用泛型类型参数使接口方法返回另一个方法的类型?
- c - 这是递归的正确应用吗?(显示堆栈的项目)
- html - 在 React Native 中渲染本地 html 文件