根据javascript对象值过滤Firestore Observable

时间:2018-02-12 17:12:34

标签: angular firebase google-cloud-firestore

我有一个Observable数据集,我使用angularfire2 snapshotChanges函数从Firestore查询获得。我能够获取信息并显示正常,所以这一切都正常。我正在努力的是以下几点。 observable包含用户已选择包含在其帐户中的团队。当他们通过"添加团队" stepper,我想突出他们已经添加的团队,不允许他们重新添加。我有一个管理用户团队数据存储的服务,我想为该服务添加一个唯一的检查。

鉴于背景,这里是服务功能uniqCheck,我现在已经搞乱了三天而无法开始工作。 .do方法不会输出任何内容,这使我相信.map方法不会做我认为应该做的事情,但是控制台中不会抛出任何错误。我不应该回到数据库来验证这一点,因为我已经在客户端中有了observable。我已经包含了我的加载功能以供参考。 uniqCheck函数就是我想要解决的问题。

我目前正在尝试的内容I found here

有什么建议吗?

private _collection: AngularFirestoreCollection<any>;
public store_userteams: Observable<any[]> = null;

load(): Promise<any> {
  return new Promise(resolve => {
    // console.log('load user team records for user ' + this._session.currentuser.uid);
    this._collection = this._firedb.collection<any>('userteams', ref => ref.where('userid', '==', this._session.currentuser.uid ));
    this.store_userteams = this._collection.snapshotChanges().map(actions => {
      return actions.map(a => {
        const data = a.payload.doc.data();
        const id = a.payload.doc.id;
        return { id, ...data };
      });
    });
    resolve(true);
  });
}

// tta is a javascript collection passed in from the component function.  tta.id is valid and correct
uniqCheck(tta): Promise<any> {
 return new Promise(resolve => {
   let matchcount = 0;
   console.log(tta.id);
   this.store_userteams
   .map( teams => teams.filter(team => team.teaminfo.id===tta.id) )
   .do( teams => console.log('filtered teams: ' + teams) )
   .subscribe( teams => matchcount = teams.length );
   console.log('matchcount: ' + matchcount);
   resolve(matchcount);
 });
}

1 个答案:

答案 0 :(得分:0)

试试这个,下面的解决方案不会将store_userteams设为Observable,并且id也会出现在每个对象中,因此很容易执行与javascript相关的过滤器(下划线或香草)

load() {
    this.loadData().subscribe(data => {
        this.store_userteams = _.pluck(data, 'data');
    });
}
loadData() {
    this._collection = this._firedb.collection<any>('userteams', ref => ref.where('userid', '==', this._session.currentuser.uid ));
    return this._collection.snapshotChanges().map(actions => {
        return actions.map(a => {
            const id = a.payload.doc.id;
            const data = a.payload.doc.data();
            data.id = id;

            return { data };
        });
    });
}

现在在uniqCheck函数中,您可以使用store_userteams对象

uniqCheck(tta) {
    // underscore or vanilla js filter on this.store_userteams
    console.log(tta);
    console.log('this.store_userteams : ', this.store_userteams);
}

希望这有帮助!