如何使用Angular 2和AngularFire2

时间:2016-09-07 06:55:16

标签: angular typescript angularfire2

我尝试从firebase检索嵌套数据并保持其类型安全。我看过这个: https://github.com/aaronksaunders/afwithngcli/blob/master/src/app/afwithngcli.component.ts 但它不使用接口。

我的界面(本示例简化):

export interface IStudy {
  $key?: string;
  description: string;
  subjects: ISubject[];
}

export interface ISubject {
  $key?: string;
  description: string;
  someOtherData: string;
  classes: IClass[];
}

export interface IClass {
  $key?: string;
  description: string;
  someOtherData: string;
}

我的服务:

@Injectable()
export class MyService {
  private myStudies$: FirebaseListObservable<IStudy[]>;

  constructor(af: AngularFire, auth: AuthService) {
    this.myStudies$ = af.database.list(`/studies/${auth.id}`).map((studies: IStudy[]) => {
      return studies.map(study => {
        study.subjects = af.database.list(`/subjects/${study.$key}`).map((subjects: Subject[]) => {
          return subjects.map(subject => {
            subject.classes = af.database.list(`/classes/${subject.$key}`);
            return subject;
          })
        });
        return study;
      })
    })
  }

  getMyStudies(): Observable<IStudy[]> {
    return this.myStudies$;
  }
}

我尝试做的是将所有学科(包括所有科目和课程)作为可观察对象,以便我可以在一个组件中显示和编辑所有级别。

我得错误说:

Type 'Observable<IStudy[]>' is not assignable to type 'FirebaseListObservable<IStudy[]>'.
Property '_ref' is missing in type 'Observable<IStudy[]>'.

Type 'Observable<ISubject[]>' is not assignable to type 'ISubject[]'.
Property 'length' is missing in type 'Observable<ISubject[]>'.

Type 'FirebaseListObservable<any[]>' is not assignable to type 'IClass[]'.
Property 'length' is missing in type 'FirebaseListObservable<any[]>'.

问题在于构造函数,错误突出显示分配给this.myStudies $,study.subjects和subject.classes的错误。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

FirebaseListObservable是与Observable不同的类型。尝试更改:

 getMyStudies(): Observable<IStudy[]> {
    return this.myStudies$;
  }

getMyStudies(): FirebaseListObservable <IStudy[]> {
    return this.myStudies$;
}

编辑:我认为你应该避免对可观察者进行如此深层次的嵌套调用,但是乍一看你有一个错误:

您要将FirebaseListObservable分配给subject.classes