2013-07-16 6 views
17

Ich habe vor kurzem begonnen, AngularJS + Firebase zu lernen. Ich versuche, in meiner Feuerbasis ein Objekt wie folgt zu schreiben:

{ 
    title: "Personal Information", 
    say: [ 
     [{ "eng": "What's", "ukr": "Що є" }, { "eng": "your", "ukr": "твоє" }, { "eng": "surname?", "ukr": "прізвище?" }], 
     [{ "eng": "Smith", "ukr": "Сміт" }], 
     [{ "eng": "What's", "ukr": "Що є" }, { "eng": "your", "ukr": "твоє" }, { "eng": "first", "ukr": "перше" }, { "eng": "name?", "ukr": "ім'я?(не фамілія)" }] 
    ] 
} 

mit Linie:

lessondata.add($scope.topic); 

wo 'lessondata' Dienst mit angularFireCollection() und $ scope.topic erstellt ist - Objekt gebunden zu meiner Benutzeroberfläche. Aber der folgende Fehler ist: Firebase.push fehlgeschlagen: erstes Argument enthält einen ungültigen Schlüssel ($$ HashKey) in der Eigenschaft 'say.0.0'. Die Schlüssel müssen nicht leere Strings sein und enthalten nicht "", "#", "$", "/", "[" oder "]"


Wie ich verstanden Firebase nicht Erlaube es, 0 als Schlüssel zu verwenden, auch wenn es sich um einen Schlüssel in einem angehängten Array handelt, für das die Null-Taste natürlich ist. Sollte ich also meine Objektstruktur in einer hartkodierten Instanz ändern oder etwas vermissen? Danke im Voraus!

Antwort

6

Das Problem ist der $ in "$$ HashKey", nicht die 0. 0 ist erlaubt.

24

BEARBEITEN: Wie Anant in den Kommentaren hervorhebt, können Sie in der neuesten stabilen Version von Angular (1.0.7 atm) angular.copy(obj) verwenden, um $$hashkey Attribute zu entfernen.

Wie Michael sagte, ist das '$' in '$$ HashKey' das Problem. Angular erzeugt die $$hashKey Eigenschaften hinter den Kulissen (mehr hier sehen: https://groups.google.com/forum/#!topic/angular/pI0IgNHKjxw). Ich habe dieses Problem gelöst, indem ich etwas wie myRef.push(angular.fromJson(angular.toJson(myAngularObject))) gemacht habe.

+1

Kühler Hack! Vielen Dank! – user2587800

+6

angular.copy() sollte auch die $$-Eigenschaft hashKey loswerden. – Anant

+0

Schön. Dies half mir, wenn ich iterativ Daten mit ng-repeat vor dem Drücken von Daten auf fb zeigte. Es ist aber ziemlich hackisch. =/ – Swordfish0321

3

Ich wollte hier eine andere Antwort werfen, die viel einfacher ist, verwenden Sie einfach track by in Ihrer Wiederholung. Es wird das $$hashKey Attribut loswerden, das so viel Kummer verursacht.

<div ng-repeat="item in items track by $index">{{item.name}}</div> 
+0

Funktioniert einwandfrei. Ich weiß nicht einmal, was $ Index ist, aber ich habe nur den "Track by $ Index" wiederholt und es war genug. –

0

Sie können die Eigenschaft auch entfernen, bevor Sie sie drücken.

delete $scope.topic.$$hashKey 
1

bin ich ein bisschen so spät, aber ich dachte, dass ich meine zwei Cent hinzufügen möchte als ich meinen Kopf zu allen anderen Antworten zitterte. Hoffentlich kann dies Ihnen helfen, dieses Problem alle zusammen zu vermeiden.

Verwenden Sie die angularFire-Bibliothek, die für die Handhabung von Winkeldaten und die Verwendung ihrer Methoden vorgesehen ist.

während ja können Sie die reinen Javascript-Bibliothek Methoden zu .push() .add() .update(), .set() ect.

Wenn Sie also irgendwelche Konflikte vermeiden wollen, wenn Feuerbasis steht in Verbindung mit Winkel Javascript Sie benötigen mit den entsprechenden .$foo() Methoden werden (das heißt .$save()).In Ihrem Fall fügen Sie einfach den $ zu Ihrem .add() (es .$add())

so lessondata.$add($scope.topic);



Unterschiede verwenden, wenn sie mit Feuerbasis des vs angularfire des


AngularFire der $save() sparende Methode ist implementiert mit Firebases set() Methode.

Firebase des push() Operation entspricht AngularFire der $add() Methode

Normalerweise sollten Sie eingestellt werden()/$ sparen(), wenn Sie entweder ein Objekt haben, die bereits in der Datenbank vorhanden ist oder wenn Sie arbeiten mit Objekte, die einen natürlichen Schlüssel haben. weitere Informationen zu diesem hier: https://stackoverflow.com/a/35959496/4642530



Dinge mit AngularFire


Für einen Rückruf zu beachten:

und wenn Sie einen Rückruf wissen wollen, ob Ihre Daten korrekt gespeichert Sie können so etwas tun:

var list = $firebaseArray(ref); 
list.$add({ foo: "bar" }).then(function(ref) { 
    var id = ref.key(); 
    console.log("added record with id " + id); 
    list.$indexFor(id); // returns location in the array 
}); 

Ich war überrascht, dass dies zuvor in keiner der anderen Antworten erwähnt wurde, aber werfen Sie einen Blick auf diese Dokumentation https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray-addnewdata

Prost.

1

Die beste Art und Weise der $$ HasKeys loszuwerden, ist „Spur durch“ in ng-Wiederholungen wie in dem folgenden (wie erwähnt in der Antwort oben)

<div ng-repeat="(key, value) in myObj track by $index"> ... </div> 

aber Sie können auch festlegen, zu verwenden, track als par von ng-model-optionen

ng-model-options="{ trackBy: '$value.someKeyOnYourObject' }" 

auf einer Formularsteuerung. Auf diese Weise wird auch die Leistung Ihrer eckigen App verbessert.

Ein anderer Weg ist die $$ HashKey verwendet

angular.copy(someObj);

zu entfernen Wenn alle Stricke reißen, können Sie auch lodash die Schlüssel zu entfernen, verwenden könnte, die mit dem „$“ beginnen.

_.omitBy(yourObject, function(value, key){return _.startsWith(key, '$');}); 
Verwandte Themen