Я пытаюсь отделить логику от моих компонентов до службы, она работает, но все равно я получаю консольные ошибки.
Я создаю эту службу и использую ее в своем компоненте
@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)">
Он компилируется без проблем, поскольку вы можете видеть, что он даже правильно отображает впросмотреть, но затем в консоли браузера я получаю это:
Если я инициализирую бизнес, наблюдаемый в моем сервисе, как это 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
}