2013-07-16 10 views
17

Recentemente ho iniziato a imparare AngularJS + Firebase. Sto cercando di scrivere nel mio Firebase un oggetto come questo:

{ 
    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": "ім'я?(не фамілія)" }] 
    ] 
} 

con la linea:

lessondata.add($scope.topic); 

dove 'lessondata' è il servizio realizzato con angularFireCollection() e $ scope.topic - oggetto associato alla mia interfaccia utente. Ma si è verificato il seguente errore: Firebase.push non riuscito: il primo argomento contiene una chiave non valida ($$ hashKey) nella proprietà 'say.0.0'. Le chiavi devono essere stringhe non vuoti e non possono contenere "", "#", "$", "/", "[" o "]"


Come ho capito Firebase non lo fanno consenti di usare 0 come chiave anche se è una chiave in un array collegato per cui la chiave zero è naturale. Quindi dovrei cambiare la mia struttura di oggetti in qualche istanza hardcoded o mi manca qualcosa? Grazie in anticipo!

risposta

6

Il problema è $ in "$$ hashKey", non lo 0. 0 è consentito.

24

MODIFICA: come sottolineato da Anant nei commenti, nell'ultima versione stabile di Angular (1.0.7 atm), è possibile utilizzare angular.copy(obj) per rimuovere gli attributi $$hashkey.

Come ha detto Michael, il "$" in "$$ hashKey" è il problema. Angolare crea le proprietà $$hashKey dietro le quinte (per ulteriori informazioni: https://groups.google.com/forum/#!topic/angular/pI0IgNHKjxw). Ho risolto questo problema facendo qualcosa come myRef.push(angular.fromJson(angular.toJson(myAngularObject))).

+1

Cool hack! Grazie mille! – user2587800

+6

angular.copy() dovrebbe sbarazzarsi anche della proprietà $$ hashKey. – Anant

+0

Bello. Questo mi ha aiutato nel mostrare iterativamente i dati con ng-repeat prima di inviare i dati a fb. Comunque è abbastanza schifoso. =/ – Swordfish0321

3

Ho voluto inserire un'altra risposta qui che è molto più semplice, basta usare track by nella tua ripetizione. Si sbarazzerà dell'attributo $$hashKey che causa così tanto dolore.

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

Funziona perfettamente. Non so nemmeno cosa sia l'indice $ ma ho appena ripetuto la "traccia per $ indice" ed è stato sufficiente. –

0

Si può anche striscia la proprietà prima di spingerla.

delete $scope.topic.$$hashKey 
1

Sono un po 'tardi per questo, ma ho pensato che vorrei aggiungere i miei due centesimi mentre stavo scuotendo la testa a tutte le altre risposte. Speriamo che questo possa aiutarti a evitare questo problema tutti insieme.

Utilizzare la libreria angularFire per gestire dati angolari e utilizzarne i metodi.

while sì è possibile utilizzare i metodi della libreria javascript puro su .push() .add() .update(), .set() ect.

Quindi, se si vuole evitare eventuali scontri quando Firebase comunica con javascript angolare è necessario essere utilizzando gli opportuni metodi .$foo() (vale a dire .$save()).Nel tuo caso basta aggiungere il $ al .add() (renderlo .$add())

in modo da utilizzare lessondata.$add($scope.topic);



differenze quando si salva con Firebase del vs il metodo di angularfire


di AngularFire $save() è implementato utilizzando il metodo set() di Firebase.

operazione di Firebase push() corrisponde a $add() il metodo di AngularFire

In genere si dovrebbe usare set()/$ save(), se hai i un oggetto che esiste già nel database o se si sta lavorando con oggetti che hanno una chiave naturale. più informazioni che qui: https://stackoverflow.com/a/35959496/4642530



cose da notare con AngularFire


Per una richiamata:

e se si vuole un callback per sapere se i dati salvati correttamente puoi fare qualcosa del genere:

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 
}); 

Sono stato sorpreso di non averlo menzionato prima in nessuna delle altre risposte, ma dai un'occhiata a questi documenti https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray-addnewdata

Cheers.

1

Il modo migliore per sbarazzarsi dei $$ hasKeys è quello di utilizzare "traccia" di NG-ripete come nell'esempio seguente (come detto nella risposta precedente)

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

, ma è anche possibile impostare traccia come par di ng-model-options

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

su un controllo modulo. In questo modo migliora anche le prestazioni della tua app angolare.

Un altro modo è quello di rimuovere il $$ HashKey sta usando

angular.copy(someObj);

Se tutto il resto fallisce, si potrebbe anche usare lodash per rimuovere le chiavi che iniziano con la "$".

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