在这里提出了类似的问题,但是一个被接受的答案并没有真正回答该问题。
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的键/值存储设计进行优化。