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

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

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

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

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还是giraffe都没有关系。

如果我创建“商店”,则每个商店都有“产品”(比方说)。

我希望能够使用
stores/{storeId}/products

但是storeId最好是从AngularFire创建的索引ID(请参阅我附带的图片)。麻烦的是,AngularFire只是创建了这个ID而没有让我知道它。

如果我有一些成功的功能,例如
success: function(response) {
  $scope.store.id = response.indexId
}

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

最佳答案

似乎肯定有一种可以完成您想要的所有事情的方法。您的第一个问题是:

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对象(如果使用angularFireAuth)。但是,只要有ID,就有多种方法可以在该用户下创建对象。假设您具有用户的ID,则将获得以下引用:
var userProductRef = new Firebase('https://myapp.firebaseio.com/users/' + userId + '/products');

因此,使用AngularFire创建product的一种方法是使用angularFireCollection创建显式数据绑定(bind):
$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());

如果您想使用隐式数据绑定(bind),则根本不需要直接使用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进行对象创建,但是正如我所提到的,我认为不要将AngularFire视为Firebase API的替代品,这只会使常见的Angular用例更加容易。根据 View 和CRUD操作的结构,使用AngularFire进行创建可能会或可能不会成功,即使它对读取/更新/等操作很有用。最后一点,虽然您可以使用AngularFire在Firebase中进行这种类型的关系数据结构化,但以后可能会造成困难。您应该强烈考虑重组数据(de-normalizing),以针对Firebase的键/值存储设计进行优化。

09-17 16:49