如何在 AngularFire2 中正确查询 Firebase 列表?

How to properly query a Firebase list in AngularFire2?

我正在开发一个以 Firebase 作为后端的 Angular2 应用程序。在子页面上,我想显示给定一周的一些任务,这些任务由路由参数指定。

我使用 BehaviorSubject 作为 AngularFire2 查询的参数,方法如下:

export class PrepareComponent implements OnInit {

    private routeSub: any;
    weekId = '';

    private weekSubject: BehaviorSubject<any> = new BehaviorSubject('weekId');

    taskTemplates$: FirebaseListObservable<TaskTemplate[]>;

    constructor(private route: ActivatedRoute,
                private router: Router,
                private angularFire: AngularFire) {

        // this.taskTemplates$ = angularFire.database.list("/taskTemplates");

这是 Firebase 查询:

        this.taskTemplates$ = angularFire.database.list("/taskTemplates", {
            query: {
                equalTo: this.weekSubject
            }
        });
    }

    ngOnInit() {
        this.routeSub = this.route.params.map(
            (params: Params) => this.weekId = params[ 'weekid' ]
        ).subscribe(
            weekId => this.weekSubject.next(weekId)
        );
    }

    ngOnDestroy() {
        this.routeSub.unsubscribe();
    }
}

不幸的是,Firebase taskTemplates$ observable 没有 returning 给定 weekId 的任何数据。

我假设一旦 weekId 将通过查询路由参数设置,列表会将其作为查询参数和 return 具有以下数据的数据:{ weekId: actualWeekId, ...}

编辑 添加了存储在 Firebase 中的数据示例:

  {
   "-Kc_E0U4UOl9PPtxpzCM" : {
   "description" : "asdfasdf",
   "weekId" : "99f2"
  },
  "-Kc_E3wv3fhpUt56sM4u" : {
    "description" : "another task",
    "weekId" : "99f2"
  }
}

所以我想做的是获取给定 weekId

的所有记录

核心问题似乎是在创建可观察列表时指定的 query

鉴于数据结构,似乎应该使用 orderByChild,因为您似乎想要 select 具有特定 weekId 的条目。

问题代码中的查询将查找键等于从激活路由获得的 weekid 的条目。但是,按键是按键,例如 -Kc_E0U4UOl9PPtxpzCM.

您还可以通过直接从激活的路由编写可观察到的查询来稍微简化代码。像这样的东西应该做你想做的事:

export class PrepareComponent implements OnInit {

  taskTemplates$: FirebaseListObservable<TaskTemplate[]>;

  constructor(
    private route: ActivatedRoute,
    private router: Router,
    private angularFire: AngularFire
  ) {}

  ngOnInit() {
    this.taskTemplates$ = this.angularFire.database.list("/taskTemplates", {
      query: {
        orderByChild: 'weekId',
        equalTo: this.route.params.map((params: Params) => params['weekid'])
      }
    });
  }
}

如果您正在使用 orderByChild,您可能会看到有关索引的控制台警告 - 如果您尚未创建索引。您需要使用安全规则来做到这一点。在文档中应该有足够的解释。

如果现在有人和我一样过得很艰难,这可能会对你们有所帮助:

db.list('/items', ref => ref.orderByChild('size').equalTo('large'))

请参考 https://github.com/angular/angularfire2/blob/master/docs/rtdb/querying-lists.md

了解更多信息!