Firebase.push失败:第一个参数包含无效键($$ hashKey)

时间:2013-07-16 15:00:04

标签: angularjs firebase

我最近开始学习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);

其中'lessondata'是使用angularFireCollection()和$ scope.topic创建的服务 - 绑定到我的UI的对象。 但得到以下错误: Firebase.push失败:第一个参数在属性“say.0.0”中包含无效键($$ hashKey)。键必须是非空字符串,不能包含“。”,“#”,“$”,“/”,“[”或“]”


据我所知,Firebase不允许使用0作为键,即使它是附加数组中的键,其中零键是自然的。那么我应该在一些硬编码实例中更改我的对象结构还是我想念一些东西?提前谢谢!

6 个答案:

答案 0 :(得分: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)))之类的事情来解决这个问题。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

我想在这里提出另一个更简单的答案,只需在重复中使用track by。它将摆脱导致如此悲痛的$$hashKey属性。

<div ng-repeat="item in items track by $index">{{item.name}}</div>

答案 3 :(得分:1)

我有点迟到了,但我想我想加上我的两分钱,因为我正在向所有其他答案摇头。希望这可以帮助您一起避免这个问题。

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

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

因此,如果您想在firebase与角度javascript 进行通信时避免任何冲突,则需要使用相应的.$foo()方法(即.$save())。在您的情况下,只需将$添加到.add()(将其设为.$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

干杯。

答案 4 :(得分:1)

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

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

但您也可以将曲目设置为ng-model-options

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

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

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

angular.copy(someObj);

如果所有其他方法都失败了,您还可以使用lodash删除以“$”开头的键。

_.omitBy(yourObject, function(value, key){return _.startsWith(key, '$');});

答案 5 :(得分:0)

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

delete $scope.topic.$$hashKey