2016-04-09 2 views
0

Firebase ermöglicht die einfache Erstellung von Arrays, beansprucht jedoch nur Lesezugriff. Ich möchte eine Reihe von Objekten haben, die ich öffnen und aktualisieren kann, oder einige ihrer Attribute ändern.Dynamische Arrays in Firebase

Das Problem besteht darin, dass Arrays in Firebase mit Zeitstempeln als Schlüssel erstellt werden. Alles in Firebase ist eine URL, und ich habe diese Schlüssel nicht in der URL.

Ich benutze AngularFire und Firebase.

.controller('LinkCtrl',[ '$scope', '$firebaseArray', '$firebaseObject', '$log', function ($scope, $firebaseArray, $firebaseObject, $log) { 

var ref = new Firebase('https://candyman.firebaseio.com/links'); 

$scope.links = $firebaseArray(ref); 

$scope.addLink = function() { 

    // newly added 
    var newLinkRef = ref.push(); 
    newLinkRef.set({ name: $scope.newLinkName, url: $scope.newLinkUrl, downloadCount: 1, timestamp: Firebase.ServerValue.TIMESTAMP }); 
    // !newly added 

    $scope.newLinkName = ''; 
    $scope.newLinkUrl = ''; 
    $log.info($scope.newLinkName + ' added to database'); 
}; 

Mein Ziel ist es, ein Objekt zu erstellen, die in meinem Array gespeichert wird, dann zu einem späteren Zeit in der Lage, eine Funktion aufzurufen, die die downloadCount für ein bestimmtes Objekt ändert. Ich kann den Link nicht hart codieren, weil ich die Anzahl für jedes der Objekte erhöhen möchte, nicht nur für eins.

Antwort

0

Wird es wirklich nicht unterstützt?

Da wir hier über Software sprechen, ist das sehr unwahrscheinlich. Es ist wahrscheinlicher, dass die Dokumentation Sie verwirrt. Es ist viel einfacher zu helfen, wenn Sie einige der Dinge zeigen, die Sie ausprobiert haben.

Für ein einfaches Beispiel, sagen, dass Sie eine Datenbank mit einer Liste von Elementen haben:

var ref = new Firebase('https://yours.firebaseio.com'); 
var itemsRef = ref.child('items'); 

Nun fügen Sie ein neues Element zu dieser Liste:

var newItemRef = ref.push(); 
newItemRef.set({ name: 'New Item', user: 'Jacob Dick', timestamp: Firebase.ServerValue.TIMESTAMP }); 

Sie können dann eine ändern einzelne Eigenschaft dieses Artikels mit:

newItemRef.update({ user: 'Frank van Puffelen' }); 
+0

Code hinzugefügt. Ich möchte meinen eigenen Schlüssel anstelle eines Zeitstempels verwenden können, * oder * irgendwie in der Lage sein, auf diesen Zeitstempel zuzugreifen und dann die direkte Verbindung zu diesem Objekt zu bekommen. Du hast recht mit meinem Missverständnis der Dokumentation. Ich schaute auf 'key()' und 'set()', aber es schien so mich wie diese wurden entweder für schreibgeschützte Arrays oder Objekte nicht in Arrays dokumentiert, für die Sie eine feste Verbindung herstellen könnten. – Jacob

+0

In Firebase gibt es keine schreibgeschützten Arrays. AngularFire '' fireBaseArray() 'ist ein automatisch synchronisiertes Array. Sie können dieses Array ändern (siehe [die Dokumentation] (https://www.firebase.com/docs/web/libraries/angular/guide/synchronized-arrays.html#section-modifying-the-array)) oder einfach modifizieren die Datenbank direkt (wie mein Code oben tut). Da AngularFire auf dem Firebase JavaScript SDK basiert, arbeiten sie perfekt zusammen. –

+0

Ich habe den von Ihnen vorgeschlagenen Code hinzugefügt, aber ich verstehe immer noch nicht, wie ich auf ein einzelnes Objekt in der Datenbank verweisen soll.Hier ein Beispiel aus der Dokumentation zum Entfernen eines Objekts aus der Datenbank: 'messages. $ Remove (someRecordKey);'. Die gleiche Seite hatte ein Beispiel für das Ändern einer Nachricht. Wie bekomme ich dann den Datensatzschlüssel für ein bestimmtes Objekt? Es speicherte den Zeitstempel unter "Zeitstempel", aber ich schrieb ihn nicht auf. Kann ich es anders nennen? – Jacob

0

Es stellt sich heraus, dass es nicht in der Dokumentation aufgeführt ist. Zumindest nicht im Voraus. Wenn Sie jedoch auf ein Element in einem Array in Ihrer Datenbank zugreifen, wird es mit allen normalen Attributen ausgeliefert, die Sie ihm gegeben haben (z. B. firstName, lastName usw. Alle regulären Attribute) plus das wunderbare Attribut id. id ist der Zeitstempel, den Ihr Element beim Hinzufügen zum Array erhalten hat.

Sobald Sie den id (der Zeitstempel) erhalten können Sie verwenden, um Ihren Artikel zu verweisen (da alle Ihre Referenzen zurück zu Ihrer Datenbank via URL fertig sind. So können Sie am Ende sagen können ...

var ref = new Firebase(https://myApp.firebaseio.com/users/); 
// ref now holds the string that is your URL 

$scope.users = $firebaseArray(ref); 

// 'user' can be passed in through $scope 
$scope.updateUserName = function (user) { 

    var userRef = new Firebase(ref + user.$id); 
    // userRef now holds the string that is the URL to your user that you just passed in 

    // don't be scared to use dynamic, client-facing variables instead of hard-coding this. It works. 
    userRef.update({ firstName: 'Jacob' }); 
}; 

Also, ja, es wird unterstützt .Die Docs könnten ein wenig nob-freundlicher sein. Keine Notwendigkeit, Elite zu sein.