【问题标题】:Displaying real-time data from firebase in .subscribe() to html using Angular 4使用Angular 4在.subscribe()中从firebase显示实时数据到html
【发布时间】:2017-10-13 07:32:07
【问题描述】:

我正在使用 Firebase 的实时数据库在 Angular 4 项目中获取我的数据,以下是我的文件:

trip-data.service.ts

import { Injectable } from '@angular/core';
declare var firebase: any;
import { Http, Response } from '@angular/http';
import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
import { Observable} from 'rxjs/Observable';



@Injectable()
export class TripDataService {

finalItems;
public data: Array<any> =[];
public myData: any[] =[];
  constructor(db: AngularFireDatabase) {

    db.object('/').snapshotChanges().map(action => {
            this.finalItems = { ...action.payload.val() };
            return this.finalItems;
          }).subscribe(item => {
            console.log(item);
            this.myData = item;
            console.log(this.myData);
          }
          );
    }
}

list.component.ts :

import { Component, OnInit } from '@angular/core';
import { TripDataService } from '../trip-data.service';
import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
import { Observable} from 'rxjs/Observable';

@Component({
  selector: 'app-list',
  templateUrl: './list.component.html',
  styleUrls: ['./list.component.css'],
  providers: [TripDataService]
})
export class ListComponent implements OnInit {
trips;
      constructor(service: TripDataService) {
            // this.trips = service();
            this.trips = service.myData;
            console.log(this.trips);
       }

      ngOnInit() {

      }

}

我从控制台中的 firebase 获得了正确的 result object,一旦我从 Firebase 获得数据,我应该如何在我的 html 文件中显示相同的数据,并且应该在 html 上更新相同的数据Firebase 数据库中的数据更新后立即打开页面?

【问题讨论】:

  • 谁能帮我解答这个问题?我正在使用“angularfire2”:“^5.0.0-rc0”

标签: angular firebase firebase-realtime-database angularfire


【解决方案1】:

问题在于myData 变量是Array,默认情况下是[]。 数组是引用类型。因此,在您的组件中,当您在 this.trips 变量中写入 this.trips = service.myData; 时,将存储对该初始空数组的引用。比当您在this.myData 中接收到的数据时,将存储对新数组的引用。

解决方案是使用下一个代码,例如(如果订阅项是一个数组):

this.myData.length = 0;   // clear array
this.myData.splice(0, 0, ...item);

【讨论】:

    【解决方案2】:

    trip-data.service.ts:

    import { Injectable } from '@angular/core';
    declare var firebase: any;
    import { Http, Response } from '@angular/http';
    import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
    import { Observable} from 'rxjs/Observable';
    
    @Injectable()
    export class TripDataService {
    
    finalItems;
    public data: Array<any> =[];
    public myData: any[] =[];
      constructor(db: AngularFireDatabase) {
    
       }
    
       returnData(){
          return this.db.object('/');
        }
    }
    

    list.component.ts :

    import { Component, OnInit } from '@angular/core';
    import { TripDataService } from '../trip-data.service';
    import { AngularFireDatabase, AngularFireObject, FirebaseObjectObservable } from 'angularfire2/database';
    import { Observable} from 'rxjs/Observable';
    
    @Component({
      selector: 'app-list',
      templateUrl: './list.component.html',
      styleUrls: ['./list.component.css'],
      providers: [TripDataService]
    })
    export class ListComponent implements OnInit {
    trips : FirebaseObjectObservable<any[]>;
    
         constructor(service: TripDataService) {
                // this.trips = service();
                this.trips = service.returnData();
                console.log(this.trips);
           }
    
         ngOnInit() {
    
         }
    
    }
    

    模板文件:

    <h2>{{(trips | async)?.name}}</h2>
    <p>{{(trips | async)?.department}}</p>
    

    【讨论】:

    • 我收到错误:“TripDataService”类型上不存在属性“returnData”。
    • @GauravA。 :trip-data.service.ts 文件中缺少此关键字以返回函数。我已经编辑了代码。现在调查一下。抱歉弄错了。
    • 我在添加评论之前已经尝试过了,但是没有奏效,它在组件文件中也显示错误“属性 'db' 不存在类型'TripDataService'”,用于 --> 行程: FireObjectObservable;它的显示找不到 FireObjectObservable,因为它在最新的 angularfire2 中被删除
    • in "angularfire2": "^4.0.0-rc0" 这个版本,上面提到的代码就像一个魅力。没有用 "angularfire2": "^5.0.0-rc0" 检查过。
    • 我正在使用“angularfire2”:“^5.0.0-rc0”,你能帮我吗?抱歉没有早点提!
    猜你喜欢
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2020-03-06
    • 2017-11-11
    • 2013-12-07
    相关资源
    最近更新 更多