Angular 5 - Observables:无法使用 Firestore 访问文档的值
Angular 5 - Observables: Can't access the value of a document using Firestore
当我尝试使用它的 id 获取文档时,我无法获取它的值,当我在控制台中显示变量时,它显示
Observable {_isScalar: false, source: Observable, operator: MapOperator}
这是我在服务中的功能定义
getDataDetails(id: any) {
this.dataDocumment = this.afs.doc('economie/' + id);
return this.dataDocumment.valueChanges();;
}
这是我的模板
<div class="main-content">
<div class="container-fluid">
<div class="header text-center">
<h3 class="title">{{dataD.adresse | async | json}}</h3>
<p class="category">Ensemble d'informations sur les communes prioritaires ou intervient CPDEP</p>
</div>
<div class="places-sweet-alerts">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header card-header-icon" data-background-color="red">
<i class="material-icons">assignment</i>
</div>
<div class="card-content">
<h4 class="card-title">Présentations des communes</h4>
<div class="toolbar">
<div class="col-lg-2"></div>
<div class="col-lg-8">
<div class="card">
<div class="card-header card-header-danger" data-background-color="red">
<h4 class="card-title">Circonscription de </h4>
<p class="category">Département du </p>
</div>
<div class="card-content">
<ul class="list-group list-group-flush">
<li class="list-group-item">Arrondissement : </li>
<li class="list-group-item">Nombre de sections communales : </li>
<li class="list-group-item">Organisation : </li>
<li class="list-group-item">Superficie : </li>
<li class="list-group-item">Population : </li>
<li class="list-group-item">Economie : </li>
<li class="list-group-item">Nombre de centres de vote : </li>
<li class="list-group-item">Nombre de bureaux de vote : </li>
<li class="list-group-item">Nombre d'électeur : </li>
</ul>
</div>
</div>
</div>
<div class="col-lg-2"></div>
</div>
</div>
<!-- end content-->
</div>
<!-- end card -->
</div>
<!-- end col-md-12 -->
</div>
</div>
</div>
</div>
这是我的组件代码
import { Component, OnInit } from '@angular/core';
import { EconomieService } from '../../services/economie.service';
import { Router, Params, ActivatedRoute} from '@angular/router';
@Component({
selector: 'app-economie-detail',
templateUrl: './economie-detail.component.html',
styleUrls: ['./economie-detail.component.scss']
})
export class EconomieDetailComponent implements OnInit {
id : string ;
dataD : any;
constructor(private eco: EconomieService,private route: ActivatedRoute) { }
ngOnInit() {
this.id = this.route.snapshot.params['id'];
this.dataD = this.eco.getDataDetails(this.id);
}
}
知道哪里出了问题吗?
根据 AngularFire2 documentation,流式文档数据使用 valueChanges()
returns 需要解包才能获取实际数据的 Observable。
您必须 subscribe
才能获得该值。
您可能还想考虑简单地使用 async
管道,以便不 unsubscribe
从订阅中避免任何内存泄漏。
因此,考虑到此函数是从名为 DataService
的服务中公开的,无论您在何处使用此函数,都只需执行以下操作:
import { Component, Input } from '@angular/core';
@Component({
...
})
export class HelloComponent {
data;
data$;
constructor(private dataService: DataService) {}
ngOnInit() {
this.dataService.getDataDetails('someId').subscribe(data => console.log(data));
// OR
this.data$ = this.dataService.getDataDetails('someId');
}
}
然后,在您的模板中:
{{ data$ | async | json }}
这将在 Observable 通过 async
管道时解包。 async
管道的输出将通过 json
管道传递,后者将 stringify
将 JSON 对象转换为字符串。这就是将打印到字符串上的内容。希望它现在有意义。
针对您的特定用例
使用这个:
{{ (dataD | async)?.adresse }}
如果有帮助,这里是 StackBlitz。我很确定这应该可以让它发挥作用。这是我在 Cloud Firestore 中的数据类型。
当我尝试使用它的 id 获取文档时,我无法获取它的值,当我在控制台中显示变量时,它显示
Observable {_isScalar: false, source: Observable, operator: MapOperator}
这是我在服务中的功能定义
getDataDetails(id: any) {
this.dataDocumment = this.afs.doc('economie/' + id);
return this.dataDocumment.valueChanges();;
}
这是我的模板
<div class="main-content">
<div class="container-fluid">
<div class="header text-center">
<h3 class="title">{{dataD.adresse | async | json}}</h3>
<p class="category">Ensemble d'informations sur les communes prioritaires ou intervient CPDEP</p>
</div>
<div class="places-sweet-alerts">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header card-header-icon" data-background-color="red">
<i class="material-icons">assignment</i>
</div>
<div class="card-content">
<h4 class="card-title">Présentations des communes</h4>
<div class="toolbar">
<div class="col-lg-2"></div>
<div class="col-lg-8">
<div class="card">
<div class="card-header card-header-danger" data-background-color="red">
<h4 class="card-title">Circonscription de </h4>
<p class="category">Département du </p>
</div>
<div class="card-content">
<ul class="list-group list-group-flush">
<li class="list-group-item">Arrondissement : </li>
<li class="list-group-item">Nombre de sections communales : </li>
<li class="list-group-item">Organisation : </li>
<li class="list-group-item">Superficie : </li>
<li class="list-group-item">Population : </li>
<li class="list-group-item">Economie : </li>
<li class="list-group-item">Nombre de centres de vote : </li>
<li class="list-group-item">Nombre de bureaux de vote : </li>
<li class="list-group-item">Nombre d'électeur : </li>
</ul>
</div>
</div>
</div>
<div class="col-lg-2"></div>
</div>
</div>
<!-- end content-->
</div>
<!-- end card -->
</div>
<!-- end col-md-12 -->
</div>
</div>
</div>
</div>
这是我的组件代码
import { Component, OnInit } from '@angular/core';
import { EconomieService } from '../../services/economie.service';
import { Router, Params, ActivatedRoute} from '@angular/router';
@Component({
selector: 'app-economie-detail',
templateUrl: './economie-detail.component.html',
styleUrls: ['./economie-detail.component.scss']
})
export class EconomieDetailComponent implements OnInit {
id : string ;
dataD : any;
constructor(private eco: EconomieService,private route: ActivatedRoute) { }
ngOnInit() {
this.id = this.route.snapshot.params['id'];
this.dataD = this.eco.getDataDetails(this.id);
}
}
知道哪里出了问题吗?
根据 AngularFire2 documentation,流式文档数据使用 valueChanges()
returns 需要解包才能获取实际数据的 Observable。
您必须 subscribe
才能获得该值。
您可能还想考虑简单地使用 async
管道,以便不 unsubscribe
从订阅中避免任何内存泄漏。
因此,考虑到此函数是从名为 DataService
的服务中公开的,无论您在何处使用此函数,都只需执行以下操作:
import { Component, Input } from '@angular/core';
@Component({
...
})
export class HelloComponent {
data;
data$;
constructor(private dataService: DataService) {}
ngOnInit() {
this.dataService.getDataDetails('someId').subscribe(data => console.log(data));
// OR
this.data$ = this.dataService.getDataDetails('someId');
}
}
然后,在您的模板中:
{{ data$ | async | json }}
这将在 Observable 通过 async
管道时解包。 async
管道的输出将通过 json
管道传递,后者将 stringify
将 JSON 对象转换为字符串。这就是将打印到字符串上的内容。希望它现在有意义。
针对您的特定用例
使用这个:
{{ (dataD | async)?.adresse }}
如果有帮助,这里是 StackBlitz。我很确定这应该可以让它发挥作用。这是我在 Cloud Firestore 中的数据类型。