【发布时间】:2019-03-05 23:35:03
【问题描述】:
我正在尝试将逻辑从我的组件分离到服务中,它可以工作,但我仍然遇到控制台错误。
我正在构建这个服务并在我的组件中使用它
@Injectable({
providedIn: 'root'
})
export class DatabaseService {
public businessDoc: AngularFirestoreDocument<Business>;
public business: Observable<Business>;
constructor(private auth: AngularFireAuth, private db: AngularFirestore) {
this.auth.authState.subscribe(user => {
this.uid = user.uid;
this.businessDoc = this.db.doc<Business>(this.businessAddress);
this.business = this.businessDoc.valueChanges()
}
}
private get businessAddress() {
return 'users/' + this.uid
}
}
这是我的组件
export class ConfigComponent implements OnInit {
config: Config;
constructor(public db: DatabaseService) {
this.db.business.subscribe(res => {
this.config = res.config;
});
}
最后,在我的模板中
<input [ngModel]="config?.regular" (ngModelChange)="onConfigChange($event)">
它编译没有问题,你可以看到它甚至在视图中正确呈现,但是在浏览器控制台中我得到了这个:
如果我在我的服务中初始化业务 observable,例如 public business: Observable<Business> = new Observable(),我不会再收到错误消息,但组件不会显示任何内容
据我了解,business 尚不存在于服务中,因为它要么等待businessDoc 连接,要么等待它自己的“valueChanges”,因此当组件尝试访问它时它确实是未定义的;这就是为什么初始化它可以解决错误日志,但会弄乱视图。
这样做的正确方法是什么?谢谢!
编辑#1:
当我将 subscribe 从组件构造函数移动到 ngOnInit 时,它会停止渲染
编辑#2:
我开始尝试一些事情,包括打开我的 Firestore,所以我删除了我订阅 authState 的行,它开始工作了。这在生产中不起作用,但我认为问题出在我的身份验证订阅上,而不是我第一次遇到困难的地方
constructor(private auth: AngularFireAuth, private db: AngularFirestore) {
// this.auth.authState.subscribe(user => {
this.uid = "twCTRUpXvYRiYGknXn6j7fe0mvj2";
this.businessDoc = db.doc<Business>(this.businessAddress);
this.business = this.businessDoc.valueChanges()
// });
}
private get businessAddress() {
return 'users/' + this.uid
}
【问题讨论】:
-
我已经删除了关于您的编辑的回答 :)
-
对于一件事,您应该将
ConfigComponent的构造函数中的逻辑移动到方法ngOnInit,这就是它所属的地方。问题似乎是this.businessDoc.valueChanges();没有返回一个可观察的。在该行之前/之后放置一个断点并检查返回值。 -
@igor 奇怪的是,当我将其移至 ngOnInit 时,它会停止渲染,并且出现相同的错误
-
您的
DatabaseService上有@Injectable()吗? -
@PierreDuc 是的,我愿意。我有
@Injectable({ providedIn: 'root'})
标签: angular angularfire2