【问题标题】:Retrieve data from an asynchronous service in a component从组件中的异步服务中检索数据
【发布时间】:2017-07-26 09:22:34
【问题描述】:

我在我的服务函数中异步从 Firebase 检索我的数据,我想在我的组件中检索它们。

我的数据库中有数据,该函数很好地返回了我的数据,但我无法在 home.ts 中检索它们(数组为空)。

tod​​olistService.ts:

    import {Injectable} from '@angular/core';
import {AngularFireDatabase, FirebaseListObservable} from 'angularfire2/database';
import * as moment from 'moment';
import 'rxjs/add/operator/map';
import {Observable} from "rxjs/Observable";

@Injectable()
export class TodolistService {

  statuts: Array<any> = [];
  dateOfTheDay: string;

  constructor(public afDB: AngularFireDatabase) {
    moment.locale('fr');
    this.dateOfTheDay = moment().format('L'); // Date au format : 04/07/2017
  }

  /**
   *
   * @returns {Observable<Array<any>>}
   */
  statusToShow():Observable<Array<any>> {
    let localStatuts: Array<any> = [];
    return this.afDB.list('/statut').map(status => {
      for (let s of status) {
        if (this.dateOfTheDay === s.statut_date_tache) {
          if (s.statut_id_tache in this.statuts === false) {
            localStatuts[s.statut_id_tache] = s;
            console.log('=== STATUSTOSHOW ===');
            console.log(localStatuts);
            return localStatuts;
          }
        }
      }
    });
  }
}

home.ts:

    import {Component} from '@angular/core';
import {ModalController, NavController} from 'ionic-angular';
import {TodolistService} from "../../providers/todolistService";

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {

  public statusOfTheDay: Array<any> = [];

  constructor(public navCtrl: NavController, public modalCtrl: ModalController, public todolistService: TodolistService) {

  }

  ionViewDidLoad() {
    this.todolistService.statusToShow().subscribe(status => this.statusOfTheDay = status);
    console.log('=== HOME ===');
    console.log(this.statusOfTheDay);
  }
}

我不知道我的问题来自哪里..“=== HOME ===”首先出现在控制台中是否正常?

提前感谢您的帮助,感谢@AJT_82。

【问题讨论】:

  • 那么您是在问如何返回 ID 尚未存储在 statuts 中且日期匹配的任何对象?
  • 我希望在我的组件 home.ts 中得到与返回 "=== STATUSTOSHOW ===" 相同的结果,因为它是空的,我不明白为什么
  • 我想是因为你的地图用错了——我现在试着写一个答案
  • console.log(this.statusOfTheDay);在订阅中使用它
  • 谢谢。但是为什么问题会出在地图上呢?因为我的函数返回的结果是正确的,只是在home.ts中我没有取回数据

标签: angular typescript asynchronous ionic-framework


【解决方案1】:

我认为这是因为您没有从您的.map 返回任何内容。您还可以使用过滤器语句使其更简单。

return this.afDB.list('/statut').map(status => {
  return status.filter(s => this.dateOfTheDay === s.statut_date_tache && (s.statut_id_tache in this.statuts === false));
});

如果您仍想退出选中状态,您可以使用

return this.afDB.list('/statut').map(status => {
  return status.filter(s => {
    if (this.dateOfTheDay === s.statut_date_tache && (s.statut_id_tache in this.statuts === false))) {
      console.log (s);
      return true;
    }
    return false;
  }
});

您还需要等待subscribe 完成后才能登录

ionViewDidLoad() {
  this.todolistService.statusToShow().subscribe(status => {
    this.statusOfTheDay = status;
    console.log('=== HOME ===');
    console.log(this.statusOfTheDay);
  });
}

【讨论】:

  • 谢谢,但我的 home.ts 还是空的:[]
  • 实际上......我不敢相信我没有注意到你在哪里记录它 - 我会更新答案
  • 在localStatuts[s.statut_id_tache]中可以push s吗?
  • 是的,与第二个代码块中的 console.log 一起添加您可能需要的任何其他代码。您还可以使用do 链接可观察序列,这可能会使您的代码更清晰
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2017-11-04
  • 2016-01-21
  • 2017-07-24
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
相关资源
最近更新 更多