【问题标题】:Angularfire2 - not saving result dataAngularfire2 - 不保存结果数据
【发布时间】:2018-07-05 02:59:09
【问题描述】:

我认为这是因为我实际上并不知道如何正确地做我想做的事。基本上,我正在保存用户和学校(也是用户)之间的关联,并且在新文档中想要从学校用户那里提取一些图像 url。我的查询都返回 undefined...

然后我基本上想将这些图像 url 保存在我将使用的另一个文档中。

结果打印到控制台就好了....

private addUserSchool(userId: string, school: any) {

    const concatId = this.concatIds(userId, school.uid);

    const userSchoolsRef: AngularFirestoreDocument<any> = this.afs.doc(`userSchools/${concatId}`);
    const schoolRef: AngularFirestoreDocument<any> = this.afs.doc(`users/${school.uid}`);
    let schoolImageURL;
    let schoolImageLogoURL;

    if(school.active) {

        schoolRef.valueChanges().subscribe(result => {
            console.log(result)
            return schoolImageURL = result.schoolImageURL;
        });
    }

    schoolRef.valueChanges().subscribe(result => {
        console.log(result)
        return schoolImageLogoURL = result.schoolImageLogoURL;
    })

    // create model from this.
    const data = {
        userId: userId,
        schoolId: school.uid,
        active: school.active ? school.active : false,
        activeSchoolImageURL: schoolImageURL ? schoolImageURL : null,
        activeSchoolLogoURL: schoolImageLogoURL ? schoolImageLogoURL : null
    }

    return userSchoolsRef.set(data, { merge: true })
}

【问题讨论】:

  • 对于 AngularFire2,subscribe 是异步的,schoolImageURLschoolImageLogoURL 的值将在 调用 set 之后分配。

标签: angular rxjs observable angularfire angularfire2


【解决方案1】:

如 cmets 中所述,当您拨打 set 时,这些值尚不可用。

当第一次调用的值可用时,您可以使用另一个 rxjs 运算符执行set

private addUserSchool(userId: string, school: any): any {

    const concatId = this.concatIds(userId, school.uid);

    const userSchoolsRef: AngularFirestoreDocument<any> = this.afs.doc(`userSchools/${concatId}`);
    const schoolRef: AngularFirestoreDocument<any> = this.afs.doc(`users/${school.uid}`);

    schoolRef.valueChanges()
        .pipe(
            take(1),
            switchMap(schoolData => {
                const data = {
                    userId: userId,
                    schoolId: school.uid,
                    active: school.active,
                    activeSchoolImageURL: school.active ? schoolData.schoolImageURL : null,
                    activeSchoolLogoURL: schoolData.schoolImageLogoURL
                };
                return of(userSchoolsRef.set(data, { merge: true }));
            })
        )
        .subscribe();
}

【讨论】:

  • 嘿,谢谢,这似乎是一种非常干净的方式,我会在最后发布我想出的。
猜你喜欢
  • 2018-08-07
  • 2018-01-01
  • 1970-01-01
  • 2016-01-29
  • 2015-04-02
  • 1970-01-01
  • 2011-12-14
  • 2019-08-30
  • 2017-08-11
相关资源
最近更新 更多