离子和AngularFireDatabase列表结果 - Property' map'类型' {}'上不存在

时间:2018-02-17 14:46:26

标签: javascript angular ionic-framework observable angularfire2

我正在尝试通过list函数从Firebase获取数据,并以Json格式使用它(在我的Google地图上加载标记)。但我在回复snapshots地图'地图'时遇到了问题。类型' {}'

上不存在

我的进口商品:

import { Component, ViewChild, ElementRef } from '@angular/core';
import { NavController, IonicPage } from 'ionic-angular';
import { Geolocation } from '@ionic-native/geolocation';
import { AngularFireDatabase } from 'angularfire2/database';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';

带有错误的代码段:

markers: Observable<any[]>;
constructor(public navCtrl: NavController, 
      public geolocation: Geolocation, 
      public db: AngularFireDatabase) { 

        this.markers = this.db.list("empresa/", {preserveSnapshot: true})
          .map(snapshots => {
            return snapshots.map(snapshot => { // this second .map displays the error
              return snapshot.val();    
            })
            .subscribe((marcas)=> {
              console.log(marcas);
            });
        });
      }

因此,我认为subscribe在控制台上没有显示任何内容。我还尝试以不同的方式导入rxjs,如此链接Property 'map' does not exist on type 'Observable<Response>',但没有成功。

1 个答案:

答案 0 :(得分:0)

似乎是迁移问题 - since AF 5.0 list返回AngularFireList<T>服务,而非FirebaseListObservable,您必须在其上调用an action以将数据流式传输到一个可观察的集合,例如:

    const subscription = this.db.list("empresa/").snapshotChanges()
      .map(snapshots => {
        return snapshots.map(snapshot => snapshot.payload.val());
      })
      .subscribe(values => {
        console.log(values);
        this.markers = values;
      });

另请注意,subscribe在外map之后被链接,而不是在示例中的内部;并且this.markers正在订阅中分配了结果,因此您必须将其类型从Observable<any[]>更改为any[](或者不管它们是什么,只是不可观察)。

有关详细信息,请参阅文档中的3. Retrieving data as lists;在页面末尾有一个示例,使用带有异步管道的角度模板中列出的项目,您不需要subscribe,然后您将this.markers保留{{ 1}}为Observable<any[]>,其余为:

this.markers = this.db.list("empresa/").snapshotChanges()
  .map(snapshots => {
    return snapshots.map(snapshot => snapshot.payload.val());
  });

这是首选,因为异步管道为您管理订阅(因为如果您手动订阅,您还应该unsubscribe)。