如何将文件从一个集合替换到另一个集合

时间:2019-05-02 06:43:28

标签: angular firebase

我在“ reviews_unchecked”集合中添加了评论。管理员必须确认它们。因此,我决定创建一个带有经过验证的评论的其他收藏集,并在确认后将评论添加到“已确认”中,并从“未选中”中删除。

我的评论服务

review: any;
  uncheckedReviewCollection: AngularFirestoreCollection<any>;
  confirmedReviewCollection: AngularFirestoreCollection<any>;
  reviewDocument: AngularFirestoreDocument<any>;

  constructor(private afs: AngularFirestore) {
    this.uncheckedReviewCollection = this.afs.collection('reviews_unchecked');
    this.confirmedReviewCollection = this.afs.collection<Review>('reviews');
   }

   getData(): Observable<any[]> {
    return this.uncheckedReviewCollection
      .snapshotChanges()
      .pipe(map((actions) => {
        return actions.map((a) => {
          const data = a.payload.doc.data();
          const id = a.payload.doc.id;
          return {id, ...data };
        });
      })
      );
  }

  getReview(id) {
    this.reviewDocument = this.afs.doc<any>('reviews_unchecked/' + id);
    this.review = this.reviewDocument.valueChanges();
    return this.review;
  }

  deleteReview(id: string) {
    return this.afs.doc<any>(`reviews_unchecked/${id}`).delete();
  }

  confirmedReview(id) {
    this.confirmedReviewCollection.add(this.review);
    return this.afs.doc<any>(`reviews_unchecked/${id}`).delete();
  }

}

我的组件

  review: any;
  reviews: Observable<any[]>;

  constructor(
    private reviewsService: ReviewsService,
  ) { }

  ngOnInit() {
    this.reviews = this.reviewsService.getData();
  }
  deleteReview(id: string) {
    this.reviewsService.deleteReview(id);
  }
  confirmedReview(id: string) {
    this.reviewsService.confirmedReview(id);
  }

为什么我有此错误以及如何解决它: 错误FirebaseError:“函数CollectionReference.add()要求其第一个参数为对象类型,但它是:自定义Observable对象”

1 个答案:

答案 0 :(得分:0)

添加文档时,文档的类型必须为object,并且不能是类的实例,因此您需要创建单独的接口或类或使用JSON.parse()进行更改到一个对象。

您可以检查以下GitHub问题:

https://github.com/angular/angularfire2/issues/1335

https://github.com/firebase/firebase-js-sdk/issues/311


尝试以下操作:

confirmedReview(id) {
let firestoreData = JSON.parse(JSON.stringify(this.review));
this.confirmedReviewCollection.add(firestoreData);
return this.afs.doc<any>(`reviews_unchecked/${id}`).delete();
}

来自docs

  

JSON.parse()方法解析一个JSON字符串,构造该字符串描述的JavaScript值或对象