Angularjs 当对象包含ng repetate时,如何使用angularFire保存Firebase对象$asArray()

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

我最近从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" : "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"