Как читать и обновлять один и тот же документ, используя angularfire2? - PullRequest
0 голосов
/ 26 ноября 2018

Я использую angularfire2, чтобы попытаться обновить мой документ Firestore.У меня есть ссылка, что я использую valueChanges, а затем подписываюсь, чтобы получить данные, но затем, так как я обновляю данные внутри функции, она будет продолжать вызывать ее, так как значения меняются.Я придумал «хакерское» решение с использованием first() from rxjs/operators, однако должен быть лучший способ сделать это.Ниже приведен код, который я пытаюсь реализовать.

this.storeCollectionRef = this.afs.collection('storeInfo');
this.storeDocumentRef= this.storeCollectionRef.doc<StoreInfo>(window.localStorage.getItem("uid"));
this.storeDocumentRef.valueChanges().subscribe(data=>{
  console.log(data.itemcount);
  var pictures = storage().ref(`${userid}/${data.itemcount+1}`);
  pictures.putString(image, "data_url").then(()=>{
    pictures.getDownloadURL().then(url => {
      this.storeInfo.itemcount = data.itemcount+1;
      this.storeInfo.image = url;
      this.storeDocumentRef.update(this.storeInfo);
    })
  });

1 Ответ

0 голосов
/ 26 ноября 2018

К сожалению, он не включен в официальные документы AngularFire2 для работы с документами Firestore.Однако, как вы, возможно, знаете, AngularFire2 - это просто оболочка вокруг оригинального пакета Firebase, предназначенная для облегчения работы с Firebase в среде Angular.Изучение документов для оригинального пакета Firebase предоставляет пример того, как достичь этой цели с помощью базового пакета Firebase:

var docRef = db.collection("cities").doc("SF");

docRef.get().then(function(doc) {
    if (doc.exists) {
        console.log("Document data:", doc.data());
    } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
    }
}).catch(function(error) {
    console.log("Error getting document:", error);
});

... что довольно просто.Если бы вы использовали оригинальный пакет Firebase, вы могли бы просто получить ссылку на ваш документ и позвонить .get() ... если бы только AngularFire2 включал эту функцию!Если копнуть немного глубже, то, похоже, это тоже оборачивает этот метод.Глядя на исходный код документов AngularFire2 Firestore , waaayyyyyy внизу, самый последний метод после valueChanges() - get()!Так что, похоже, это ПОДДЕРЖИВАЕТСЯ, просто не задокументировано.

/**
   * Retrieve the document once.
   * @param options
   */
get(options?: firestore.GetOptions) {
    return from(this.ref.get(options)).pipe(
        runInZone(this.afs.scheduler.zone)
    );
}

Я не в состоянии проверить это сам, поэтому не могу обещать, что это сработает.Попробуйте и дайте мне знать.В крайнем случае, если вы не можете заставить AF2 вести себя, вы можете пропустить использование пакета AngularFire2 для этой конкретной функции, а также импортировать исходный пакет Firebase в этот компонент и просто ссылаться на документ, используя метод пакета Firebase.

РЕДАКТИРОВАТЬ:

В случае, если это не было ясно, я предлагаю вам попробовать что-то вроде:

this.storeCollectionRef = this.afs.collection('storeInfo');
this.storeDocumentRef= this.storeCollectionRef.doc<StoreInfo>(window.localStorage.getItem("uid"));

this.storeDocumentRef.get().then( data => {
    console.log(data.itemcount);
    // ... etc...
    // continue doing your picture uploading stuff here
    // ...
});
...