这是我正在尝试做的事情:
我在项目中使用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引用,但它会在堆栈跟踪中找到空响应。我猜这是因为它在实际解决之前被调用了,但我不知道如何解决这个问题(我确信这是一个简单的解决方案,我只是没有得到或者不知道)
非常感谢!
答案 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.
}
});
}
}