Я работаю над проектом с Angular 5 и Firestore, используя AngularFire2 .Я пытаюсь сделать следующее: «Когда пользователь вводит идентификатор документа при первом вводе, два других поля загружаются автоматически при получении данных из Firebase.
Вот изображение моегоформа
Это всего лишь один пример. Мне легко, если все данные находятся в одной коллекции, тогда я просто предварительно загружаю еев ngOnInit
, но в некоторых случаях мне приходится отображать данные из других коллекций, например Users
.
Вот что я делаю:
- Я обнаружил изменение и вызвал функцию
(change)="getPropertyInfo($event)"
- Я вызываю FireBase и получаю данные
код:
getPropertyInfo($document_id) {
this.afs.collection('properties', ref => {
return ref.where('strata_plan_no', '==', $document_id.target.value);
}).valueChanges().subscribe(property => {
if (property[0]) { // if these is any record
this.jobForm.street_address = property[0]['street_address'];
this.jobForm.suburb = property[0]['suburb'];
console.log(property[0]);
// I have a field called user_id in this property collection as well.
}
});
}
Теперь ятакже хочу получить информацию о пользователе, используя выбранный property_id
, который я делаю так:
getUserByID(id: string): Observable < any > {
return this.afs.collection('users').doc(id).valueChanges();
}
Issue здесь, это то, что этот пользователь является наблюдаемым. Я ищудля некоторого способа преобразовать его как объект, чтобы я мог связать его с моими полями пользователя в форме.
Кроме того, если в случае пользователей, если я подпишусьЧто касается наблюдаемого, как и приведенного выше кода, я не смогу мгновенно получить данные для отображения, поскольку они асинхронные.
Пожалуйста, исправьте меня, если я ошибаюсь, и предложите что-нибудь, что я мог бы попробовать.1042 *
Спасибо
Обновление
Я следовал DauleDK советам.Теперь я использую подход «Реактивные формы», чтобы получить больше информации о своей обработке форм, серии «Наблюдаемые наблюдения», и у меня есть разумное представление о том, как все работает внутри.
Вот что у меня сейчас:
ngAfterViewInit(): void {
this.jobsForm.get('property.strata_plan_no')
.valueChanges
.sample(Observable.fromEvent(this.strata_plan_no_input.nativeElement, 'blur'))
.subscribe((strata_plan_no) => {
this.propertyService.findByStrataPlanNo(strata_plan_no)
.filter((property) => property !== null) // filter nulls
.map(property => property[0]) // return the first element of the array
.subscribe((property) => {
console.log(property.manager_id); // this log gives me the ID i'm looking for.
this.managerService.findByID(property.manager_id).subscribe((manager) => { // this subscribe gives me an error
console.log(manager);
});
});
});
}
Вот ошибка, которую я получаю:
core.js:1449 ERROR TypeError: Cannot read property 'onSnapshot' of undefined
at Observable.eval [as _subscribe] (fromRef.js:8)
at Observable._trySubscribe (Observable.js:172)
at Observable.subscribe (Observable.js:160)
at ObserveOnOperator.call (observeOn.js:74)
at Observable.subscribe (Observable.js:157)
at Observable.ConnectableObservable.connect (ConnectableObservable.js:43)
at RefCountOperator.call (refCount.js:25)
at Observable.subscribe (Observable.js:157)
at MapOperator.call (map.js:57)
at Observable.subscribe (Observable.js:157)