【发布时间】:2017-05-16 03:21:12
【问题描述】:
我想在一个 Angular2 应用程序中提供一项服务,该服务可以完成所有数据库工作。我看到的所有教程都使用 http 而不是 firebase,所以它们并没有真正的帮助。我让服务构造函数从数据库中提取我需要的数据,但是当页面尝试从服务中获取数据时,它什么也得不到,因为数据库调用尚未完成。我开始觉得this post,将网络调用放在服务中没有任何意义,它们都应该是每个控制器中的重复代码,而不是将所有数据库代码放在一个服务中。这是我的文件:
lesson.service.ts
import { Injectable, OnInit } from '@angular/core';
import { AngularFireDatabase, FirebaseObjectObservable } from 'angularfire2/database';
export class Lesson {
constructor(public id: number, public buttons: Object[]) { }
}
@Injectable()
export class LessonService implements OnInit {
private lessons: Lesson[] = [];
constructor(public db: AngularFireDatabase) {
}
ngOnInit() {
this.db.object('/lessons', { preserveSnapshot: true }).subscribe(lessons => {
lessons.forEach(lesson => {
this.lessons.push(new Lesson(
lesson.key,
lesson.val()['buttons']
));
});
});
}
getLessons() {
console.log('getting lessons', this.lessons);
return this.lessons;
}
getLesson(id: number): Lesson {
// return new Promise()
console.log('getLesson', this.lessons);
return this.lessons.filter(lesson => {
return lesson.id === id;
})[0];
}
}
lesson.ts
import { Component, OnInit, Input } from '@angular/core';
import { Lesson, LessonService } from '../lesson.service';
@Component({
selector: 'lesson',
templateUrl: './lesson.html',
styleUrls: ['./lesson.scss']
})
export class LessonComponent implements OnInit {
@Input() lessonID: number = 0;
lesson: Lesson;
constructor(public service: LessonService) { }
ngOnInit() {
this.lesson = this.service.getLesson(this.lessonID);
console.log('view lessons', this.lesson);
}
}
lesson.html
<lesson [lessonID]="selectedId"></lesson>
当我尝试加载课程组件时,它发现没有课程,因为this.lessons 没有从服务的构造函数的数据库中填写。我看到的唯一“解决方案”是删除课程服务,并在每个页面加载时调用 DB,在我看来,这违背了做单页应用程序的目的。
【问题讨论】:
标签: angular firebase firebase-realtime-database