【问题标题】:Setting Your Own Key When Adding an Object to Firebase - AngularFire向 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。我刚刚添加的对象保存在这个键下。

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

【问题讨论】:

标签: javascript angularjs firebase angularfire


【解决方案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 中删除。

    这是我的解决方法。

    1. 监听 $onAuth
    2. 创建一个新的 $firebaseObject,其中 ref 作为用户的子级,id 作为 uid(在本例中为 facebook)
    3. 保存用户对象

      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,
                      });
      

      【讨论】:

        猜你喜欢
        • 2015-08-04
        • 1970-01-01
        • 2016-03-06
        • 2018-01-17
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多