Angular 5 - Observables: невозможно получить доступ к значению документа с помощью Firestore - PullRequest
0 голосов
/ 28 августа 2018

Я не могу получить значение документа, когда пытаюсь получить его, используя его идентификатор, когда я отображаю переменную в консоли, на которой он отображает

Наблюдаемый {_isScalar: false, источник: Наблюдаемый, оператор: 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);
  }
}

Есть идеи, что идет не так?

1 Ответ

0 голосов
/ 28 августа 2018

Согласно документации AngularFire2 , потоковые данные документа с использованием valueChanges() возвращают наблюдаемый объект, который необходимо развернуть, чтобы получить фактические данные.

Вам потребуется 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 pipe. Независимо от того, что является выводом канала async, он будет передаваться через канал json, который stringify Объект JSON будет преобразован в строку. И это то, что будет напечатано на строку. Надеюсь, теперь это имеет смысл.

Для вашего конкретного случая использования

Используйте это:

{{ (dataD | async)?.adresse }}

Вот StackBlitz , если это поможет. Я почти уверен, что это должно заставить его работать. Вот данные, которые у меня есть в Cloud Firestore.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...