2017-07-12 8 views
1

Ich versuche, eine Eigenschaft in einem Datensatz in Firebase-Datenbank mit AngularJS zu aktualisieren. Ich kann eine Abfrage einrichten, um meine Platte zu finden:Firebase Update() keine Funktion mit einer Abfrage

firebase.database().ref('en/').orderByChild('word').equalTo('the').once('value') 
    .then(function(snapshot) { 
    snapshot.forEach(function(childSnapshot) { 
     console.log(childSnapshot.val()) 
    }); 
    }) 

ich mein Eigentum aktualisieren kann, wenn ich in der Aufzeichnung des hard Schlüssel:

firebase.database().ref('en/-KloeQHDC-mugPjJMAG4').update({ wordFrequency: 111 }) 

Aber wenn ich eine Abfrage einrichten, den Datensatz finden und dann aktualisieren, erhalte ich eine Fehlermeldung update is not a function:

firebase.database().ref('en/').orderByChild('word').equalTo('the').update({ wordFrequency: 9001 }) 

ein weiterer answer schlägt update() aus dem Inneren einer forEach Schleife Aufruf:

firebase.database().ref('en/').orderByChild('word').equalTo('the').once('value') 
    .then(function(snapshot) { 
    snapshot.forEach(function(childSnapshot) { 
     console.log(childSnapshot.val()); // this works 
     childSnapshot.ref().update({ wordFrequency: 9001 }); 
    }); 
    }); 

dass eine Fehlermeldung zurückgibt TypeError: childSnapshot.ref is not a function. Ich sehe nicht, wie childSnapshot ist ein Firebase ref.

Ein weiterer answer sagt

Wenn Sie update() auf einen Ort nennen, Firebase Datenschleifen über , die Sie in geben (in Ihrem Fall asJson) und für jede Taste führt eine ref.child (Schlüssel) .set (Wert).

Wenn update() Schleifen über die Daten, warum sollte ich update() aus dem Inneren einer forEach Schleife nennen? Die documentation zeigt nicht aufrufen update() von innerhalb einer forEach Schleife.

Antwort

2

Das Firebase Database SDK bietet eine Reference.update() Methode zum Aktualisieren von Daten an einem einzelnen Speicherort in einer Datenbank. Der Schlüssel hier ist, dass ein Reference ein einzelner Ort in der Datenbank ist, so ist klar, was zu aktualisieren ist.

Meine Pseudo-Code-Erklärung über die Funktionsweise von Multi-Path-Updates bezieht sich auf die Art und Weise, wie der Datenbankserver sie implementiert: Bei einem einzigen Speicherort/DatabaseReference aktualisiert sie jeden Pfad im darauf basierenden update()-Aufruf.

A Query können mehrere Standorte in der Datenbank übereinstimmen, es hat so keine update() Methode (oder set() oder remove() für diese Angelegenheit).

Um jede Position durch eine Abfrage abgestimmt aktualisieren Sie die Abfrage ausführen und jedes Ergebnis rufen dann update() auf - entweder durch einen child_added Hörer oder mit einem value Hörer und einer Schleife wie in Ihrem letzten Schnipsel.

+0

Vielen Dank! Die Dokumentation (https://firebase.google.com/docs/reference/js/firebase.database.Reference#update) könnte klarer sein. Es könnte erklären, dass update() einfach zu verwenden ist, wenn Sie den Schlüssel haben, und schwierig ohne den Schlüssel zu verwenden. Das Beispiel, in dem "ada" als Schlüssel verwendet wird, ist verwirrend, da "ada" nicht wie ein Firebase-Schlüssel aussieht (z. B. -kh4j5hf7g67h). Ich habe eine Antwort auf meine Frage gepostet, die update() einfach macht, wenn Sie den Schlüssel im Auge behalten. Es könnte auch ein Beispiel mit der onComplete-Funktion haben. –

1

Nachdem ich diese Frage gestellt hatte, ging ich mit dem Hund spazieren, aß zu Abend, und dann kam die Lösung zu mir. Meine neue Regel lautet: "Der Schlüssel zu Firebase-Abfragen besteht darin, den Schlüssel zu verfolgen."

Mit dieser Vorlage können Benutzer Datensätze in der Datenbank aktualisieren. Sie geben einen Suchbegriff in ein Formularfeld ein und klicken auf "Suchen".Der $scope.search Handler fragt die Datenbank Firebase und dann füllt die Formularfelder mit den Eigenschaften des Rekord:

$scope.search = function() { 
    myFirebase_ref.orderByChild('word').equalTo($scope.word).once('value') 
    .then(function(snapshot) { 
    snapshot.forEach(function(childSnapshot) { 
     $scope.wordKey = childSnapshot.key; 
     $scope.audioArray = childSnapshot.val().audio; 
     $scope.ipaArray = childSnapshot.val().ipa; 
     $scope.language = childSnapshot.val().language; 
     $scope.longLanguage = childSnapshot.val().longLanguage; 
     $scope.phonemeArray = childSnapshot.val().phonemes; 
     $scope.translationArray = childSnapshot.val().translations; 
     $scope.word = childSnapshot.val().word; 
     $scope.wordFrequency = childSnapshot.val().wordFrequency; 
     $scope.$apply(); 
    }); 
    }) 
    .catch(function(error) { 
    console.error("Authentication failed:", error.message); 
    }); 
}; 

Hinweis an der Spitze der Eigenschaftszuweisungen I $scope.wordKey = childSnapshot.key; haben. Ich behalte den Schlüssel des Datensatzes im Auge.

Der Benutzer aktualisiert dann ein Feld. Jedes Feld hat eine Schaltfläche neben "Update". Jeder Button geht zu einem Handler. Zum Beispiel zu aktualisieren, um das wordFrequency Feld Ich habe diese Prozedur:

$scope.updateFrequencyRank = function() { 
    firebase.database().ref('en/' + $scope.wordKey).update({ wordFrequency: $scope.wordFrequency }) 
}; 

eine Zeile Code und es funktioniert! Noch besser, ich machte eine onComplete Funktion, um mir zu sagen, wenn das Update erfolgreich war:

$scope.updateFrequencyRank = function() { 

    var onComplete = function(error) { 
    if (error) { 
     console.log('Update failed'); 
    } else { 
     console.log('Update succeeded'); 
    } 
    }; 

    firebase.database().ref('en/' + $scope.wordKey).update({ wordFrequency: $scope.wordFrequency }, onComplete); 
};