删除了以下划线开头的 Firebase 数据库键

Firebase database keys beginning with underscore removed

我开始编写一个网络应用程序,用户对象有一个 _username 键,所以它在开头。

如果我将对象添加到 firebase 数据库,它不存在 - 其他一切都存在。

为什么这个 key/value 对不在数据库中?我的意思是它有效 JSON,不是吗?
我的意思是除了简单地重命名它还有其他解决方案吗?

我被推送到数组的对象具有以下结构:

{
    _username:"",
    history:[],
    // ...
}

我的代码:

var users = $firebaseArray(ref.child("user"));

// adding user
users.$add($scope.session.user);
// logging afterwards - also no '_username'

// logging on init
users.$loaded().then(function (data) {
    $log.debug(data);
});

一切都被存储,除了下划线变量...

看起来 $add()(或更具体地说 $firebaseUtils.toJSON())删除了名称以 _ 开头的属性。快速查看的方法是:

console.log($firebaseUtils.toJSON(user));

解决方法是通过 JavaScript SDK 将用户对象直接写入数据库:

ref.child("user").push(user);

写入所有具有有效键名称的属性,包括以 _.

为前缀的属性

由于 AngularFire 是在相同的 JavaScript SDK 之上构建的,它会立即获取更改。

jsbin 中的演示:http://jsbin.com/lobadej/edit?js,console

这是一个设计决定,基于以下事实:声明私有变量的常见 JavaScript 约定是在它们前面加上 _

关于为什么它不同于默认 SDK 行为的上下文,请记住 AngularFire 正在创建可以扩展的 class 个实例,并提供 client-side 功能(不是只是用于数据传输的原始 JSON 对象)。因此,我们的目标是尽可能简单直接地扩展和使用 $firebaseArray 和 $firebaseObject,并使保存和服务器同步尽可能透明。

为此,您需要一个简单的约定来将 "local" 或私有内容与您要发送到服务器的内容分开。由于 $ 在技术上由 Angular 库保留,因此 _ 仍然是在 ES6 之前为私有变量和方法添加前缀的适当方式。

如果有很多人在这里遇到问题,我们可以重新访问,但考虑到它已经以这种方式实施了将近 3 年,而且这是对它的第一条评论,我怀疑它没有问题。

另请参阅:https://github.com/firebase/angularfire/issues/901