【问题标题】:How to get Data as Object from Firebase to Service and then to Page correctly (Angularfire + ionic4)?如何将数据作为对象从 Firebase 获取到服务,然后正确地到页面(Angularfire + ionic4)?
【发布时间】:2021-11-13 17:19:20
【问题描述】:

我正在尝试通过 firebase.service 将数据从 Firebase Realtimedatabase 获取到我的 mypage.page

  • 我可以在firebase.servicemypage.page 中获取简单数据(例如字符串),但我无法将对象加载到mypage.page
  • 在控制台中我收到一堆错误消息Cannot read properties of undefined (reading 'id')

控制台日志:

core.js:6479 ERROR TypeError: Cannot read properties of undefined (reading 'id')
    at MypagePage_Template (template.html:8)
    at executeTemplate (core.js:9598)
    at refreshView (core.js:9464)
    at refreshComponent (core.js:10635)
    at refreshChildComponents (core.js:9261)
    at refreshView (core.js:9514)
    at refreshEmbeddedViews (core.js:10589)
    at refreshView (core.js:9488)
    at refreshComponent (core.js:10635)
    at refreshChildComponents (core.js:9261)

如何将Object 通过Promisefirebase.service 传递到mypage.page


Parent question.

mypage.page.ts代码:

import { Component, OnInit } from '@angular/core';
import { DataObject, FirebaseService } from '../firebase.service';

@Component({
  selector: 'app-mypage',
  templateUrl: './mypage.page.html',
  styleUrls: ['./mypage.page.scss'],
})
export class MypagePage implements OnInit {
  localData: DataObject;

  constructor(private firebaseService: FirebaseService) {
    this.firebaseService.getData().then(data => {
      this.localData = data;
   }).catch((error) => {
    console.error(error);
  });
  }

  ngOnInit() {
  }

}

firebase.service.ts代码:

import { Injectable } from '@angular/core';
import { AngularFireDatabase } from '@angular/fire/compat/database';
import { DatabaseReference } from '@angular/fire/compat/database/interfaces';

export interface DataObject{
  id: string;
  data: string;
}

@Injectable({
  providedIn: 'root'
})
export class FirebaseService {
  databaseRef: DatabaseReference;

  constructor(private db: AngularFireDatabase) {
    this.databaseRef = db.database.ref(); //Create databaseReference
  }

  getData(): Promise<any> {
    return this.databaseRef.child('data').get().then((snapshot) => {
      if (snapshot.exists()) {
        return {id: '1', data: snapshot.val()};
      } else {
        return null;
      }
    }).catch((error) => {
      console.error(error);
    });
  }
}

mypage.page.html代码:

<ion-header>
  <ion-toolbar>
    <ion-title>mypage</ion-title>
  </ion-toolbar>
</ion-header>

<ion-content>
  <ion-label>{{ localData.id }}</ion-label>
</ion-content>

【问题讨论】:

    标签: angular typescript firebase-realtime-database ionic4 angularfire


    【解决方案1】:

    这应该可以按预期工作,您得到的错误是因为localData 确实是undefined,直到数据来自网络。

    你有两个解决方案:

    1. 要么给localData一个初始值,所以它不再是undefined
    export class MypagePage implements OnInit {
      localData: Partial<DataObject> = {};
      // ...
    }
    
    1. 在标签上放一个ngIf,只是在数据还没有的时候不显示它:
    <ion-content>
      <ion-label *ngIf="localData">{{ localData.id }}</ion-label>
    </ion-content>
    

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 2011-06-07
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      相关资源
      最近更新 更多