向 Firebase 添加对象时设置自己的密钥 - AngularFire

Posted

技术标签:

【中文标题】向 Firebase 添加对象时设置自己的密钥 - AngularFire【英文标题】:Setting Your Own Key When Adding an Object to Firebase - AngularFire 【发布时间】:2014-08-24 22:53:10 【问题描述】:

我可以使用以下方法将对象添加到我的 Firebase 数据存储:

var uniqueId = 
    name: "a name",
    location: "new york"

$scope.myItems.$add(uniqueId).then(function(firebaseId)
    // do something on success
, function()
    // do something if call fails
);

上面将添加一个对象到我的数据存储中,如果添加成功,则返回一个由 Firebase 生成的 ID。我刚刚添加的对象保存在这个键下。

当我添加到我的数据存储时,我是否可以指定密钥名称?

【问题讨论】:

是的。只需使用childset,例如nameRef.child('first').set('Fred');。见firebase.com/docs/writing-data.html。在可能转换为 $save() 的 AngularFire 中,请参阅 github.com/firebase/angularFire/blob/…。 这里有类似的问题:***.com/questions/18050856/… 【参考方案1】:

Firebase 中的所有内容 都是 URL。

以以下网址为例。

https://myapp.firebaseio.com/users/

假设我们想在这个位置创建一个键为 1 的用户作为孩子。我们的 URL 如下所示。

https://myapp.firebaseio.com/users/1

要使用 AngularFire 创建用户,我们可以在 users 节点创建一个引用并调用 $child(1) 来创建对该位置的引用。

var usersRef = new Firebase('https://myapp.firebaseio.com/users');
var userRef = new Firebase('https://myapp.firebaseio.com/user/1');

$scope.users = $firebase(usersRef);

// these are the same
$scope.userOne = $firebase(userRef);
$scope.userOne = $scope.users.$child(1);

然后我们可以使用$set来存储用户在那个位置的值。

var usersRef = new Firebase('https://myapp.firebaseio.com/users');
$scope.users = $firebase(usersRef);
$scope.users.$child(1).set(
  first: 'Vincent',
  last: 'Van Gough',
  ears: 1
);

在你的情况下是:

var uniqueId = 
    id: 1,
    name: "a name",
    location: "new york"
;
$scope.myItems.$child(uniqueId.id).$set(uniqueId);

请记住,使用$set 将破坏该位置的任何先前数据。要以非破坏性方式更新值,请使用 $update

【讨论】:

我知道$child + $set 组合。我只是不知道您必须将两者链接在一起才能使其工作。如果您使用两个单独的命令调用$child 然后$set,则更改不会通过 那是因为 $child 返回一个 $firebase 对象。如果将结果存储在变量或 $scope 中,则不必将它们链接在一起。 我已经在自己的服务器上尝试过完全相同的代码,但它不起作用。我总是得到未定义的不是一个引用 $child 的函数。我怀疑新的 API 不包含 $child。它甚至没有出现在他们的 API 文档中:firebase.com/docs/web/libraries/angular/… 是的,AngularFire 的 API 自 0.8 更新以来已进行了重大更新。 $child 在那个版本中被删除了。 @DavidEast $child 的新等价物是什么?在这里阅读时找不到它:firebase.com/blog/2014-07-30-introducing-angularfire-08.html请帮助。【参考方案2】:

你可以这样试试:

var empsRef = ref.child("employees");

empsRef.child('11111').set(
  lastname: "Lee",
  firstname: "Kang"
);

empsRef.child('22222').set(
  lastname: "Nut",
  firstname: "Dough"
);

输出应如下所示:

"employees" : 
  "11111" : 
    "lastname" : "Lee",
    "firstname": "Kang"
  ,
  "22222" : 
    "lastname" : "Nut",
    "firstname": "Dough"
  

【讨论】:

【参考方案3】:

看起来 $child 和 $set 已从 AngularFire API 中删除。

这是我的解决方法。

    监听 $onAuth 创建一个新的 $firebaseObject,其中 ref 作为用户的子级,id 作为 uid(在本例中为 facebook)

    保存用户对象

    angular.module("app.services", []).factory("Auth", function ($firebaseAuth, $firebaseObject, FirebaseUrl) 
    var auth = $firebaseAuth(new Firebase(FirebaseUrl));
    
    auth.$onAuth(function (authData) 
        if (authData) 
            var ref = new Firebase(FirebaseUrl + "/users/" + authData.uid);
            var user = $firebaseObject(ref);
            user.name = authData.facebook.displayName;
            user.$save().then(function () 
                console.log(user);
            );
        
    );
    return auth;
    )
    

不过,我仍在努力使其可测试...

【讨论】:

【参考方案4】:

.set 仍在 angularfire api 中工作

那么,试试这个……

var gT = $scope.ultima[0].guia + 1;                    
var _db = firebase.database().ref('/guias/' + gT);
                      _db.set(
                    'artigo': _dt.artigo,
                    'inicio': $scope.ultima[0].fim + 1,
                    'guia': $scope.ultima[0].guia + 1,
                    'fim': $scope.ultima[0].fim + 1 + (1 * _dt.quantidade),
                    'quantidade': _dt.quantidade,
                );

【讨论】:

以上是关于向 Firebase 添加对象时设置自己的密钥 - AngularFire的主要内容,如果未能解决你的问题,请参考以下文章

错误:向 Firebase 发送 ios 推送时出现 InvalidApnsCredential,添加了身份验证密钥和证书

Firebase:设置其他用户属性

将新数据推送到 Firebase 数据库时设置自定义键

向大约 15 个 firebase 对象添加值/子事件会导致堆大小增加吗?

将新数据推送到firebase数据库时设置自定义数字键

Firebase 云消息传递 - 如何向 APN 添加声音