【问题标题】:Firebase.push failed: first argument contains an invalid key ($$hashKey)Firebase.push 失败:第一个参数包含无效密钥 ($$hashKey)
【发布时间】:2013-07-14 20:17:56
【问题描述】:

我最近开始学习 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 作为键,即使它是附加数组中的键,零键是自然的。那么我应该在一些硬编码实例中更改我的对象结构还是我错过了什么?提前致谢!

【问题讨论】:

    标签: angularjs firebase


    【解决方案1】:

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

    正如 Michael 所说,'$$hashKey' 中的 '$' 是问题所在。 Angular 在幕后创建 $$hashKey 属性(在此处查看更多信息:https://groups.google.com/forum/#!topic/angular/pI0IgNHKjxw)。我通过myRef.push(angular.fromJson(angular.toJson(myAngularObject))) 之类的方法解决了这个问题。

    【讨论】:

    • 酷黑客!非常感谢!
    • angular.copy() 也应该去掉 $$hashKey 属性。
    • 不错。这有助于我在将数据推送到 fb 之前使用 ng-repeat 迭代显示数据。不过,这很hackish。 =/
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 完美运行。我什至不知道 $index 是什么,但我只是重复了“track by $index”就足够了。
      【解决方案4】:

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

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

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

      因此,如果您想在 firebase 与 Angular 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

      干杯。

      【讨论】:

        【解决方案5】:

        摆脱 $$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, '$');});
        

        【讨论】:

          【解决方案6】:

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

          delete $scope.topic.$$hashKey
          

          【讨论】:

            猜你喜欢
            • 2018-08-18
            • 1970-01-01
            • 2019-09-08
            • 2020-04-07
            • 2017-09-12
            • 2018-01-15
            • 2017-12-01
            • 1970-01-01
            • 2021-03-03
            相关资源
            最近更新 更多