3

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

使用 AngularFire,是否可以创建关系型数据库?或者访问 UniqueIDs?

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

在此处输入图像描述

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

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 中的其他东西“下”制作东西时,我刚刚遇到了一堵砖墙。不管是users还是giraffes。

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

我希望能够用

stores/{storeId}/products

storeId理想情况下是从 AngularFire 创建的索引 ID(参见我附上的图片)。问题是,AngularFire 只是创建了这个 ID,而没有让我知道。

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

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

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

4

3 回答 3

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。

由于您想productsusers我认为@bennlich 下创建,因此试图了解用户的 id 应该可以从其他一些变量中获得,例如user如果您使用的是对象,则为angularFireAuth. 但是,只要您确实有 id,就有多种方法可以在该用户下创建对象。假设您拥有用户 ID,您将拥有以下参考:

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

product因此,使用 AngularFire创建的一种方法是使用以下命令创建显式数据绑定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 来创建对象,但如前所述,我认为不要将 AngularFire 视为 Firebase API 的替代品,它只会让常见的 Angular 用例变得更加容易。根据您的视图和 CRUD 操作的结构,它可能会或可能不会使用 AngularFire 进行创建,即使它对读取/更新/等操作很有用。最后一点,虽然您可以使用 AngularFire 在 Firebase 中进行这种类型的关系数据结构化,但以后可能会遇到困难。您应该强烈考虑重组(反规范化)数据以优化 Firebase 的键/值存储设计。

于 2013-10-20T14:30:34.107 回答
3

在新版本的 AngularFire 中,您可以只遍历 AngularFire 对象,就好像它是一个普通的 javascript 对象一样。

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

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

最后,您熟悉浏览器的开发者工具吗?它们对于窥视您不知道如何处理的对象内部(例如 AngularFire)非常有用,以了解它们的内部结构。

于 2013-10-19T16:10:07.153 回答
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));
        }
    };

试试看,如果有帮助请告诉我!!!

于 2015-04-08T19:29:24.373 回答