firestore angularfirestore angularjs firebase

angularjs - angularfirestore - Firebase.push falló: el primer argumento contiene una clave no válida($$ hashKey)



angularfire2 ionic (6)

EDITAR: Como Anant señala en los comentarios, en la última versión estable de Angular (1.0.7 atm), puede usar angular.copy(obj) para eliminar los atributos $$hashkey .

Como dijo Michael, el problema es el ''$'' en ''$$ hashKey''. Angular crea las propiedades $$hashKey detrás de escena (consulte más información aquí: https://groups.google.com/forum/#!topic/angular/pI0IgNHKjxw ). He myRef.push(angular.fromJson(angular.toJson(myAngularObject))) este problema haciendo algo como myRef.push(angular.fromJson(angular.toJson(myAngularObject))) .

Recientemente empecé a aprender AngularJS + Firebase. Estoy tratando de escribir en mi base de fuego un objeto como este:

{ 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 linea:

lessondata.add($scope.topic);

donde ''lessondata'' es un servicio creado con angularFireCollection () y $ scope.topic - objeto vinculado a mi interfaz de usuario. Pero se produjo el siguiente error: Firebase.push falló: el primer argumento contiene una clave no válida ($$ hashKey) en la propiedad ''say.0.0''. Las claves deben ser cadenas no vacías y no pueden contener ".", "#", "$", "/", "[" O "]"

Como entendí, Firebase no permite usar 0 como clave, incluso si es una clave en una matriz adjunta para la cual la clave cero es natural. Entonces, ¿debería cambiar la estructura de mi objeto en una instancia codificada o me pierdo algo? ¡Gracias por adelantado!


El problema es el $ en "$$ hashKey", no se permite el 0. 0.


La mejor manera de deshacerse de los $$ hasKeys es usar "track by" en ng-repeticiones como en la siguiente (como se mencionó en la respuesta anterior)

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

pero también puede establecer la pista como par de ng-model-options

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

en un control de formulario. De esta manera también mejora el rendimiento de su aplicación angular.

Otra forma es eliminar el hashKey de $$ usando

angular.copy(someObj);

Si todo lo demás falla, también puede usar el comando lodash para eliminar las claves que comienzan con "$".

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


Llego un poco tarde a esto, pero pensé que me gustaría agregar mis dos centavos mientras sacudía mi cabeza a todas las otras respuestas. Esperemos que esto pueda ayudarte a evitar este problema todos juntos.

Utilice la biblioteca angularFire destinada a manejar datos angulares y utilice sus métodos.

mientras que sí, puede usar los métodos de la biblioteca javascript pura para .push() .add() .update() , .set() ect.

Por lo tanto, si desea evitar cualquier conflicto cuando Firebase se comunica con javascript angular , debe utilizar los métodos apropiados de .$foo() (es decir, .$save() ). En su caso, solo agregue $ a su .add() (haga que .$add() )

así que use lessondata.$add($scope.topic);



Diferencias al guardar con Firebase''s vs Angularfire''s

El método $save() AngularFire se implementa utilizando el método set() Firebase.

La operación push() Firebase corresponde al método $add() AngularFire

Normalmente, debería usar set () / $ save () si tiene un objeto que ya existe en la base de datos o si está trabajando con objetos que tienen una clave natural. más información sobre eso aquí: https://.com/a/35959496/4642530



Cosas a tener en cuenta con AngularFire

Para una devolución de llamada:

y si desea una devolución de llamada para saber si sus datos se guardaron correctamente, puede hacer algo como esto:

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

Me sorprendió que esto no se haya mencionado anteriormente en ninguna de las otras respuestas, pero eche un vistazo a estos documentos https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray-addnewdata

Aclamaciones.


Quería lanzar otra respuesta aquí que es mucho más simple, solo use track by en su repetición. Se librará del atributo $$hashKey que está causando tanto dolor.

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


También puede quitar la propiedad antes de empujarla.

delete $scope.topic.$$hashKey