首页 > 解决方案 > Angularfire2 - 不保存结果数据

问题描述

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

基本上,然后我想将这些图像 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 })
}

标签: angularrxjsobservableangularfireangularfire2

解决方案


如评论中所述,当您拨打电话时,这些值尚不可用set

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

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();
}

推荐阅读