【问题标题】:Firebase database keys beginning with underscore removed删除以下划线开头的 Firebase 数据库键
【发布时间】:2017-01-14 04:01:17
【问题描述】:

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

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

为什么这个键/值对不在数据库中?我的意思是它是有效的 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);
});

所有内容都被存储,除了下划线变量...

【问题讨论】:

标签: javascript angularjs firebase-realtime-database angularfire


【解决方案1】:

看起来$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

【讨论】:

    【解决方案2】:

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

    关于它为何不同于默认 SDK 行为的上下文,请记住 AngularFire 正在创建可扩展的类实例,并提供客户端功能(不仅仅是用于数据传输的原始 JSON 对象)。所以我们这里的目标是让扩展和使用 $firebaseArray 和 $firebaseObject 尽可能简单直接,并使保存和服务器同步尽可能透明。

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

    如果有很多人在这里遇到问题,我们可以重新审视,但鉴于它已经以这种方式实施了近 3 年,而且这是对它的第一次评论,我怀疑它还可以。

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

    【讨论】:

    • 嗯,是的-我只是想知道|和一些我用下划线“优先”的变量 - 很高兴知道原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2016-07-06
    • 2018-03-07
    • 2016-10-20
    相关资源
    最近更新 更多