使用AngularFire从Firebase显示用户数据

时间:2014-05-16 21:52:12

标签: angularjs angularjs-scope angularjs-ng-repeat firebase angularfire

这是我正在尝试做的事情:

我在项目中使用AngularJS和firebase,其中: 1.然后发生匿名登录 2.使用我可以检索的ID为该登录创建firebase数据存储区中的记录 3.数据结构中添加了几个其他信息(用户的名字和其他一些东西)。

我想使用ng-repeat来显示与用户及其会话相关联的数字对应的多个HTMl元素。他们有机会增加或减少这一数额。例如,如果他们将此数字增加到10,我想使用ng-repeat来显示10个HTML元素。如果他们将它减少到9,则显示9等。

我遇到的问题是查询firebase以获取与其特定匿名登录相关联的记录。 firebase简单登录返回一个promise,我使用了firebase getCurrentUserID()方法等待,并且能够在从服务器返回会话后检索会话的匿名用户ID。

到目前为止,这是我的代码

(这是控制器中的所有视图)

// wire a new Firebase connection
var ref = new Firebase('https://myfirebaseloginexample.firebaseio.com');


// connect the user object to the firebase
$scope.userRef = $firebase(ref);
// wire anonymous login
$scope.loginObj = $firebaseSimpleLogin(ref);
// wait for the anonymous login data to load and persist
$scope.loginObj.$getCurrentUser().then(function() {
  console.log($scope.loginObj.user.id);
});

我已经能够使用当前的匿名会话来查询Firebase中的关联数据,并使用以下代码(也在控制器中)增加它

// increment the number of boxes
    $scope.incrementboxCount = function() {
      // assign the session id to a variable
      var uniqueSessionChildID = $scope.loginObj.user.id;
      // pass the assigned id variable into the firebase connection, where we will find the reference with the current child (the sesison ID)
      var sessionLoc = $scope.userRef.$child(uniqueSessionChildID);
      // get the current number of boxes at the location in firebase ref specified by the session ID
      var getBoxes = sessionLoc.numberBoxes;
      // find the firebase reference that we want by ID, update it and increment the amount of boxes
      $scope.userRef.$child(uniqueSessionChildID).$update({
        numberBoxes: getBoxes + 1
      });
    };

关联的html:

<div ng-model="(not sure of proper model)">
  <div ng-repeat="box in boxes">
    <h1>How many boxes?</h1>
    <h4>{{not sure of proper express here}}</h4>
  </div>
</div>

我尝试过尝试访问loginObj数据(特别是唯一的匿名ID),这样我就可以查询Firebase引用,但它会在堆栈跟踪中找到空响应。我猜这是因为它在实际解决之前被调用了,但我不知道如何解决这个问题(我确信这是一个简单的解决方案,我只是没有得到或者不知道)

非常感谢!

1 个答案:

答案 0 :(得分:4)

由于$scope.loginObj.user.id返回承诺,您无法预期var uniqueSessionChildID会立即存储承诺;你需要等待然后使用它的响应。也许这可以解决你的问题:

// This is wrong.
var uniqueSessionChildID = $scope.loginObj.user.id; 
var sessionLoc = $scope.userRef.$child(uniqueSessionChildID);

// This is better.
$scope.loginObj.$getCurrentUser().then(function(user) {
  if (user) { // Now, user isn't null.
    var sessionLoc = $scope.userRef.$child(user.id);

    // Here, you could do whatever you want with your session reference.

  } 
});

另一方面,如果您希望user.id在其他控制器中可用,但您不想在每次需要时提出要求,则可以使用resolve。我想给你举个例子:

resolve: {
  session: function($rootScope) {
    return $rootScope.loginObj.$getCurrentUser().then(function (user) {
      if (user) {
        $rootScope.anonymousUserID = user.id; // It will be injected into the controller.
      }
    });
  }
}