Как сохранить объекты Firebase $ asArray () с angularFire, когда объекты содержат ng-repeat
Я недавно перешел с angularfire 0.6 на 0.8.0. У меня проблемы с сохранением элемента списка, который содержит сам массив.
Мои объектыучетная запись выглядеть так:
{
"-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]",
}
}
Длительности представляют собой массив периодов времени с началом и концом, которые напоминают повторение ng двух полей ввода в HTML.
<tr ng-repeat="duration in account.durations">
<td>
<input ng-model="duration.start" datepicker>
</td>
<td>
<input ng-model="duration.end" datepicker>
</td>
</tr>
Перед сохранением учетной записи в firebase я делаю angular.copy ($ scope.account) в контроллере, чтобы избавиться от угловых значений $ hash. Это сработало в angularfire 0.6.0.
В angularfire 0.8.0 я все еще получаю ошибку:
Ошибка: Firebase.set не удалось: первый аргумент содержит недопустимый ключ ($ hashKey) в свойстве durations.0. Ключи должны быть непустыми строками и не должны содержать ".", "#", "$7$quot;, "/", "[" Или "]
Как решить эту проблему с помощью angularfire при работе с объектами, которые имеют массивы внутри себя? Длительности не будут единственным массивом, который я буду иметь в пределах учетной записи. Так есть ли более профессиональное решение, или мне нужно angular.copy каждый объект массива, прежде чем сохранить в firebase через angularfire?
Заранее спасибо за любой намек.
Обновление (11 августа 14) После небольшого исследования проблема не в том, что использование angular.copy () больше не работает. на самом деле это так. Но очень просто обновить / изменить существующий набор данных с помощью метода angularfire $ save () (https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebaseobject-save) Потому что я не могу найти правильный способ $ save () для элемента после выполнения angular.copy ().
Обновление 2 (12 августа, 14) Я нашел обходной путь на данный момент, но на самом деле обходной путь - это то, чего я хотел избежать в первую очередь:
// 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;
});
Я думаю, что этот обходной путь использует преимущества основанного на документе принципа в Firebase, так как я должен знать точные атрибуты объекта перед его сохранением через AngularFire.
Обновление 3 (13. Авг 14) Я добавил jsfiddle, чтобы показать проблему:jsfiddle.net/1fem6byt
Если вы добавите строки в массив, а затем попытаетесь сохранить объект в базе данных, в консоли появится ошибка $ hashKey (приведенная выше). Есть способы обойти эту проблему, но я ищу более простое или более чистое решение с angularfire, если это возможно. Я могу неправильно добавлять строки - или я что-то пропустил?