web-dev-qa-db-fra.com

Firestore - Écoutez le changement de champ spécifique?

Comment puis-je écouter un changement de champ spécifique avec firestore js sdk?

Dans la documentation, ils semblent seulement montrer comment écouter le document entier. Si un champ "SF" change, le rappel sera déclenché.

db.collection("cities").doc("SF")
.onSnapshot(function(doc) {
    console.log("Current data: ", doc && doc.data());
});
11
httpete

Tu ne peux pas. Toutes les opérations dans Firestore sont sur un document entier.

Ceci est également vrai pour Déclencheurs Firestore de Cloud Functions (vous pouvez uniquement recevoir un document entier modifié d'une manière ou d'une autre).

Si vous devez restreindre la portée de certaines données à extraire d'un document, placez-les dans un document d'une sous-collection et interrogez-les individuellement.

12
Doug Stevenson

Juste au cas où vous voudriez ignorer des événements dans certains champs, vous pouvez faire quelque chose comme:

export const yourCloudFunction = functions.firestore
.document('/your-path')
  .onUpdate(
    field('foo', 'REMOVED', (change, context) => {
      console.log('Will get here only if foo was removed');
      // ... Your implementation here
    }),
  );

J'ai créé un Gist de la fonction fieldici . Rappelez-vous, cela n'empêche pas votre fonction de s'exécuter si des modifications se produisent dans d'autres champs, elle ne vous en parlera pas et renverra une promesse résolue.

1
Christian

Écoutez le document, puis définissez une condition sur le champ qui vous intéresse:

firebase.firestore().collection('Dictionaries').doc('Spanish').collection('Words').doc(Word).collection('Pronunciations').doc('Castilian-female-IBM').onSnapshot(function(snapshot) {
                      if (snapshot.data().audioFiles) { // eliminates an error message
                        if (snapshot.data().audioFiles.length === 2) {
                          audioFilesReady++;
                          if (audioFilesReady === 3) {
                            $scope.showNextWord();
                          }
                        }
                      }
                    }, function(error) {
                      console.error(error);
                    });

J'écoute un document pour une voix (Castilian-female-IBM), qui contient un tableau de fichiers audio aux formats webm et mp3. Lorsque ces deux fichiers audio sont revenus de manière asynchrone, snapshot.data().audioFiles.length === 2. Cela incrémente un conditionnel. Lorsque deux autres voix reviennent (Castilian-male-IBM et Latin_American-female-IBM), alors audioFilesReady === 3 et la fonction suivante $scope.showNextWord() se déclenchent.

0
Thomas David Kehoe