获取Firebase AngularFire中项目的索引ID

时间:2013-10-18 21:54:43

标签: javascript firebase angularfire

这里也提出了类似的问题,但接受的答案并没有真正回答这个问题。

Using AngularFire, is it possible to to create relational-style databases? Or access the UniqueIDs?

通过AngularFire将嵌套项目添加到Firebase时,每个项目实际上都是在另一个以数字编号的索引下设置的。

enter image description here

因此,我需要使用以下相对网址引用用户的产品:

users/:id/products

我的问题是,一旦我创建了一个用户(或其他任何事情),我该如何获得索引值?

// Get the users
var ref = new Firebase('https://myapp.firebaseio.com/users')
var promise = angularFire(ref, $scope, 'users', {})
promise.then(function() {
  // Can I get the ID from here somehow?
})

// Users saves a product
id = null // ???
var product = {
   name: 'new product',
   desc: 'this is a new product'
}
var ref = new Firebase('https://myapp.firebaseio.com/users/' + id + '/products')
var promise = angularFire(ref, $scope, 'products', {})
promise.then(function() {
  $scope.products.push(product)
})

更新

为了澄清,这不是关于用户身份验证的问题。我已经有了照顾。对困惑感到抱歉。

当我开始在Firebase中“处理”其他内容时,我刚碰到了一堵砖墙。如果它是user s或giraffe s无关紧要。

如果我制作“商店”,每个商店都有“产品”(比如说。)

我希望能够使用

检索它们
stores/{storeId}/products

storeId理想情况下是从AngularFire创建的索引ID(参见我附上的图片)。麻烦的是,AngularFire只是在不让我知道的情况下创建了这个ID。

如果我有一些成功的功能,如

success: function(response) { 
  $scope.store.id = response.indexId
}

这将是最有意义的,但似乎没有出现AngularFire准备这个非常需要的功能。请证明我错了。 :)

3 个答案:

答案 0 :(得分:4)

肯定有办法做你想要的一切。你的第一个问题是:

var promise = angularFire(ref, $scope, 'users', {})
promise.then(function() {
  // Can I get the ID from here somehow?
})

promise返回此通话后,$scope.users将成为用户的对象,其密钥是您已创建的用户的ID值。所以要访问这些用户的ID:

var promise = angularFire(ref, $scope, 'users')
promise.then(function() {
  for(var userId in $scope.users){
    console.log("User Id: " + userId);
  }
});

这对您最终想要实现的目标似乎没有多大帮助,但至少您可以看到如何从AngularFire返回所有用户的ID。

由于你想在products下创建users,我认为@bennlich试图了解用户的id应该可以从其他变量获得,例如{user 1}}对象,如果您使用angularFireAuth。但是,只要具有id,就有多种方法可以在该用户下创建对象。如果您拥有用户的ID,则您将拥有以下参考:

var userProductRef = new Firebase('https://myapp.firebaseio.com/users/' + userId + '/products');

因此,使用AngularFire创建product的一种方法是使用angularFireCollection创建显式数据绑定:

$scope.userProducts = angularFireCollection(userProductRef);
// create a new product
var newProductRef = $scope.userProducts.add({name: 'new product', desc: 'this is a new product'});
console.log("New product id: " + newProductRef.name());

如果你想使用隐式数据绑定,你根本不需要直接使用AngularFire来创建对象,因为数据同步是暗示的。""在这种情况下,您必须记住AngularFire只是vanilla Firebase API的扩展/扩充,并不打算替代。因此,您可能会使用Firebase .push方法创建ID:

// sync $scope.userProducts with Firebase
var promise = angularFire(userProductRef, $scope, 'userProducts');
// create a new product when promise fulfilled
promise.then(function(){
  var newProductId = userProductRef.push(); // here is your id
  // this will sync to Firebase automatically because of the implied angularFire binding
  $scope.userProducts[newProductId] = {name: 'new product', desc: 'this is a new product'};
});

这些方法使用AngularFire进行对象创建,但如上所述,我认为将FlaularFire视为Firebase API的替代品有助于它,它只会使常见的Angular用例更容易。根据视图和CRUD操作的结构,从使用AngularFire进行创建可能会也可能不会,即使它对Read / Update / etc操作很有用。最后一点,虽然可以使用AngularFire在Firebase中进行这种类型的关系数据结构化,但它可能会在以后造成困难。您应该强烈考虑重组(de-normalizing)您的数据,以优化Firebase的键/值存储设计。

答案 1 :(得分:3)

在新版本的AngularFire中,您可以像使用普通的javascript对象一样遍历AngularFire对象。

$scope.users = {};
angularFire(ref, $scope, 'users').then(function() {
    for (var id in $scope.users) {
        if ($scope.users.hasOwnProperty(id) {
            ...
        }
    }
});

我认为这不是你想要做的,因为你要将所有用户数据加载到每个客户端。您可能应该让客户端提供用户名或其他类型的ID,可能是Firebase Simple Login

最后,您熟悉浏览器的developer tools吗?它们对于窥视你不知道如何处理的对象(如AngularFire)来说非常有用,可以看看它们是如何在内部构建的。

答案 2 :(得分:1)

对于所有这类问题,我有最好和最快的答案!

var chru;
    var ref = new Firebase("https://myapp.firebaseio.com/users/");
    var sync = $firebase(ref);
    var users= syncSelect.$asArray();
    $scope.users= users;
    users.$loaded().then(function() {
        chru = users.length;
    });

    $scope.specificIdOnSelect = function() {
        var jj;
        for (jj = 0; jj < chru; jj++) {
            var keyer = users.$keyAt(jj);
            var rec = users.$getRecord(keyer);

            if ($scope.userSelected== rec.name) {
                alert("Unique Key of " + $scope.users+ " is " + users.$keyAt(jj));
            }
        }
    };

    $scope.allIds = function() {
        var jj;
        for (jj = 0; jj < chru; jj++) {
            var keyer = users.$keyAt(jj);
            var rec = users.$getRecord(keyer);
            alert("Unique Key of " + $scope.users+ " is " + users.$keyAt(jj));
        }
    };

尝试一下然后请告诉我这是否有帮助!!!