So speichern Sie Firebase-Objekte $ asArray () mit angularFire, wenn die Objekte ng-repetate enthalten

Ich habe kürzlich von Angularfire 0.6 auf 0.8.0 umgestellt. Ich habe Probleme, einen Listeneintrag zu speichern, der ein Array selbst enthält.

Meine ObjekteKonto sieht aus wie das:

{
  "-JQruasomekeys0nrXxH" : {
    "created" : "2014-03-23T22:00:10.176Z",
    "durations" : [ {
      "$hashKey": "00L", // this is generated by ng-repeat on arrays
      "end" : "2014-07-15T22:00:00.000Z",
      "start" : "2014-07-09T22:00:00.000Z"
    } ],
    "email" : "[email protected]",
  }
}

Die Dauer ist eine Reihe von Zeiträumen mit Anfang und Ende, die durch eine ng-Wiederholung von zwei Eingabefeldern in HTML vergleichbar sind.

<tr ng-repeat="duration in account.durations">
  <td>
     <input ng-model="duration.start" datepicker>
  </td>
  <td>
     <input ng-model="duration.end" datepicker>
  </td>
</tr>

Bevor ich das Konto in Firebase speichere, muss ich angle.copy ($ scope.account) im Controller ausführen, um die winkligen $ -Hash-Werte zu entfernen. Dies funktionierte in anglefire 0.6.0.

In anglefire 0.8.0 erhalte ich immer noch den Fehler:

Fehler: Firebase.set fehlgeschlagen: Das erste Argument enthält einen ungültigen Schlüssel ($ hashKey) in der Eigenschaft 'durations.0'. Schlüssel dürfen keine leeren Zeichenfolgen sein und dürfen nicht ".", "#", "$7$quot;, "/", "[" Oder "] enthalten.

Wie soll das durch Angularfire gelöst werden, wenn mit Objekten gearbeitet wird, die Arrays in sich haben? Die Dauer wird nicht das einzige Array sein, über das ich im Konto verfüge. Gibt es also eine professionellere Lösung, oder muss ich jedes einzelne Array-Objekt winklig kopieren, bevor ich es über Angularfire in der Firebase speichere?

Vielen Dank im Voraus für jeden Hinweis.

Aktualisierung (11. Aug 14) Nach ein wenig Recherche ist das Problem nicht, dass die Verwendung von angular.copy () nicht mehr funktioniert. eigentlich schon. Es ist jedoch sehr unhandlich, einen vorhandenen Datensatz mit der Angularfire-Methode $ save () zu aktualisieren / zu ändern (https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebaseobject-save) Weil ich scheinbar keinen richtigen Weg finde, um ein Element zu speichern, nachdem angle.copy () ausgeführt wurde.

Update 2 (12. August 14) Im Moment habe ich eine Problemumgehung gefunden, aber eigentlich wollte ich diese zunächst vermeiden:

// loop for every duration, that should clean the object from "$hashKey" attributes
angular.forEach($scope.account.durations, function (value, index) {
  var cleanValue = {};

  // checks, if the date is a JSON string already
  if (typeof value.start === 'string') {
    cleanValue.start = value.start;
  } else {
    cleanValue.start = value.start.toJSON();
  }

  // checks, if the date is a JSON string already
  if (typeof value.end === 'string') {
    cleanValue.end = value.end;
  } else {
    cleanValue.end = value.end.toJSON();
  }

  // overwrite the array object at index to get loose of $hashKey
  $scope.account.durations[index] = cleanValue;
});

Ich denke, dass diese Problemumgehung die Vorteile des dokumentbasierten Prinzips in Firebase nutzt, da ich die genauen Attribute eines Objekts kennen muss, bevor ich es über AngularFire speichere.

Update 3 (13. AUg 14) Ich habe eine jsfiddle hinzugefügt, um das Problem zu zeigen:jsfiddle.net/1fem6byt

Wenn Sie dem Array Zeilen hinzufügen und dann versuchen, das Objekt in der Firebase zu speichern, wird der oben angegebene $ hashKey-Fehler in der Konsole angezeigt. Es gibt Möglichkeiten, dieses Problem zu umgehen, aber ich suche nach einer einfacheren oder saubereren Lösung mit Angularfire, wenn möglich. Möglicherweise füge ich Zeilen nicht richtig hinzu - oder vermisse ich etwas?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage