Как заменить документ из одной коллекции в другую - PullRequest
0 голосов
/ 02 мая 2019

Я добавил обзор в коллекцию "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 голосов
/ 02 мая 2019

При добавлении документа он должен иметь тип 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();
}

Из документов :

Метод JSON.parse() анализирует строку JSON, создавая значение JavaScript или объект, описываемый строкой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...