这里也提出了类似的问题,但接受的答案并没有真正回答这个问题。
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
s或giraffe
s无关紧要。
如果我制作“商店”,每个商店都有“产品”(比如说。)
我希望能够使用
检索它们stores/{storeId}/products
但storeId
理想情况下是从AngularFire创建的索引ID(参见我附上的图片)。麻烦的是,AngularFire只是在不让我知道的情况下创建了这个ID。
如果我有一些成功的功能,如
success: function(response) {
$scope.store.id = response.indexId
}
这将是最有意义的,但似乎没有出现AngularFire准备这个非常需要的功能。请证明我错了。 :)
答案 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));
}
};
尝试一下然后请告诉我这是否有帮助!!!