Angularjs 当对象包含ng repetate时,如何使用angularFire保存Firebase对象$asArray()
我最近从angularfire 0.6切换到了0.8.0。我在保存包含数组本身的列表项时遇到问题 我的对象帐户如下所示:Angularjs 当对象包含ng repetate时,如何使用angularFire保存Firebase对象$asArray(),angularjs,multidimensional-array,angularjs-ng-repeat,firebase,angularfire,Angularjs,Multidimensional Array,Angularjs Ng Repeat,Firebase,Angularfire,我最近从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
{
"-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" : "some@mail.net",
}
}
持续时间是一个包含开始和结束的时间段数组,类似于HTML中两个输入字段的ng重复
<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中基于文档的原则的优点,因为在通过AngularFire存储对象之前,我必须知道对象的确切属性
更新3(2014年8月13日)
我添加了一个JSFIDLE来说明问题:
如果向数组添加行,然后尝试将对象保存到firebase,控制台中将出现$$hashKey错误(如上所示)。有很多方法可以解决这个问题,但如果可能的话,我想用angularfire找到一个更简单、更干净的解决方案。我可能没有正确地添加行,或者我遗漏了什么?当然,在firebase中解决这一问题的最好方法是像前面提到的那样,将数据从数组实时绑定到视图中。您应该通过$asArray实例使用额外的firebase同步对象 类似于此解决方案:但您将失去使用按钮“按需”保存数据的可能性,如
保存到Firebase
。在firebase阵列对象发生更改后,它们将立即保存。但它也将为您提供跨页面数据的灵活性和同步性
但在您的情况下,另一个更简单的方法是在ng repeat指令中更改angular跟踪对象唯一性的方式。可以通过在ng repeat
语句末尾设置track by$index
来完成
将ng repeat=“帐户中的持续时间.持续时间”
更改为:
ng-repeat="duration in account.durations track by $index"
您的JSFIDLE已使用此解决方案更新:
关于ngRepeat的跟踪方式的更多信息,您可以找到
希望我能帮上忙。您在angularfire 0.8.0中使用的angularjs版本?我没有看到您的数据中有任何$$hashKey,也没有看到设置或保存此列表的任何代码。那是从哪里来的?如果问题集不完整,就很难提出解决方案。我使用的是angular 1.2.21。$$hashKey由ng repeat在angular中生成。实际上,在使用$add()()方法创建帐户的过程中,angular.copy()起作用。但是我不能在更新数据()时使用$save()时使用angular.copy()。您的代码仍然不完整。我们在复制什么(确切地说是为什么?)。$asObject()在哪里使用?尝试创建一个小的代码示例来重现您的问题。这将产生更智能的答案和更快的修复。@RIA,这种结构仍然没有任何意义。如果您想要一个持续时间数组,请获取它们。不要将父对象(account/)作为对象获取,然后尝试将其子对象用作集合。嵌入的数组无法工作,因为angular向其附加了无效的属性。我将研究一些关于未来发布的想法。然而,AngularFire是一个绑定库——它绑定对象和集合——而不是Firebase数据树的本地副本。直接拿到收藏品就行了。
ng-repeat="duration in account.durations track by $index"