17

我最近开始学习 AngularJS+Firebase。我正在尝试在我的 firebase 中写一个像这样的对象:

{
    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": "ім'я?(не фамілія)" }]
    ]
}

带线:

lessondata.add($scope.topic);

其中“课程数据”是使用 angularFireCollection() 和 $scope.topic 创建的服务 - 绑定到我的 UI 的对象。但出现以下错误: Firebase.push failed: first argument contains an invalid key ($$hashKey) in property 'say.0.0'。键必须是非空字符串,并且不能包含“.”、“#”、“$”、“/”、“[”或“]”


据我了解,Firebase 不允许使用 0 作为键,即使它是附加数组中的键,零键是自然的。那么我应该在一些硬编码实例中更改我的对象结构还是我错过了什么?提前致谢!

4

6 回答 6

25

编辑:正如 Anant 在评论中指出的那样,在 Angular 的最新稳定版本(1.0.7 atm)中,您可以使用angular.copy(obj)删除$$hashkey属性。

就像迈克尔说的那样,'$$hashKey' 中的'$' 是问题所在。Angular$$hashKey在幕后创建属性(在此处查看更多信息:https ://groups.google.com/forum/#!topic/angular/pI0IgNHKjxw )。我已经通过做类似的事情解决了这个问题myRef.push(angular.fromJson(angular.toJson(myAngularObject)))

于 2013-07-16T19:32:01.233 回答
6

问题是“$$hashKey”中的 $,而不是 0. 0 是允许的。

于 2013-07-16T16:55:21.007 回答
4

我想在这里提出另一个更简单的答案,只需track by在您的重复中使用即可。它将摆脱$$hashKey造成如此多悲伤的属性。

<div ng-repeat="item in items track by $index">{{item.name}}</div>
于 2015-09-22T20:37:45.373 回答
1

摆脱 $$hasKeys 的最佳方法是在 ng-repeats 中使用“track by”,如下所示(如上面的答案中所述)

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

但您也可以将 track 设置为 ng-model-options 的一部分

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

在表单控件上。这种方式还可以提高 Angular 应用程序的性能。

另一种方法是删除 $$hashKey 正在使用

angular.copy(someObj);

如果一切都失败了,您还可以使用 lodash 删除以“$”开头的键。

_.omitBy(yourObject, function(value, key){return _.startsWith(key, '$');});
于 2016-10-08T09:53:03.847 回答
1

我对此有点晚了,但我想我想加两分钱,因为我对所有其他答案都摇头。希望这可以帮助您一起避免这个问题。

使用 angularFire 库来处理角度数据并使用它的方法。

虽然是的,但您可以使用纯 javascript 库方法.push() .add() .update().set()等等。

因此,如果您想在 firebase 与 angular javascript 通信时避免任何冲突,您需要使用适当的.$foo()方法(即.$save())。在您的情况下,只需添加$到您的.add()(make it .$add())

所以用lessondata.$add($scope.topic);



使用 firebase 与 angularfire 保存时的差异


AngularFire 的$save()方法是使用 Firebase 的set()方法实现的。

Firebase的push()操作对应AngularFire的$add()方法

通常,如果您有一个已存在于数据库中的对象,或者您正在使用具有自然键的对象,则应该使用 set()/$save()。更多信息在这里:https ://stackoverflow.com/a/35959496/4642530



AngularFire 的注意事项


对于回调:

如果您想要回调以了解您的数据是否正确保存,您可以执行以下操作:

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

我很惊讶这在其他任何答案中都没有提到,但是看看这些文档https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray-addnewdata

干杯。

于 2016-06-21T23:28:33.407 回答
0

您也可以在推送之前剥离该属性。

delete $scope.topic.$$hashKey
于 2016-04-10T13:52:09.923 回答