2016-07-30 94 views
1

我想要做的事情应该相当简单 - 从我的Firebase数据库加载对象并将其分配给我的控制器中的变量。这在我使用Firebase函数(请参阅注释代码)之前完美工作,但我想使用3-way绑定,因此我正在尝试在AngularFire中执行相同的操作。

$加载的事件似乎没有触发,因为规划器对象(也就是'你在这里')永远不会打印到控制台。 user.uid字符串按预期打印到控制台,并且注释掉的代码完美地工作。在此先感谢您的帮助。

(边问题:在注释掉的代码,我利用evalAsync,保证了网页上的表格时,信息检索实际更新 - 这是很好的做法?)

我的控制器:

firebase.auth().onAuthStateChanged(function(user) { 
     if (user) { 
      console.log("Currently logged in user..."); 
      console.log(user.uid); 
      $scope.user = user; 

      var ref = firebase.database().ref('planners/' + $scope.user.uid); 
      var planner = $firebaseObject(ref); 

      planner.$loaded().then(function() { 
       console.log("You are here") 
       console.log(planner) 
      }) 
      .catch(function(error) { 
       console.log(error) 
      }) 
      // firebase.database().ref('planners/' + $scope.user.uid).on('value', function(response) { 
      // if (response.val() != null) { 
      //  $scope.$evalAsync(function() { 
      //   $scope.planner = response.val(); 
      //  }) 
      // } 
      // }); 
     } 
     else { 
      console.log('No user logged in') 
      $state.go('login') 
     } 
    }) 

回答

0

由于@Aaron桑德斯建议,你应该使用AngularFire权威性的对象,因为它与角度更好地集成(更新$scope S,触发$digest小号等)。

之前因为$evalAsync而启动的代码,如果没有运行$digest$digest循环是在模型和视图之间绑定数据的魔术师),则代码被启动。

你实际上应该做的是使用AngularFire绑定数据。他们还利用$bindTo提供“三维绑定”(模型 - 视图 - 数据库)。

正如你可以在$firebaseObjectdocs数据看到从服务器同步到客户端的自动的,但如果你想保存本地更改回服务器,你应该使用$save$bindTo

代码修复建议:

$firebaseAuth().$onAuthStateChanged(function(user) { 
    // By using `$firebaseAuth` this function will be called in a `$digest` so all changes will be bound 
    if (user) { 
     console.log("Currently logged in user..."); 
     console.log(user.uid); 
     $scope.user = user; 

     var ref = firebase.database().ref('planners/' + $scope.user.uid); 
     // `$destroy` previous bindings 
     if ($scope.planner && angular.isFunction($scope.planner.$destroy)) { 
      $scope.planner.$destroy(); 
     } 
     $scope.planner = $firebaseObject(ref); 

     // planner.$loaded().then(function() { 
     // // This code will happen only after `$digest` since its promise is relied on the `$q` service 
     // console.log("You are here") 
     // console.log(planner) 
     // }) 
     // .catch(function(error) { 
     // console.log(error) 
     // }) 
     // firebase.database().ref('planners/' + $scope.user.uid).on('value', function(response) { 
     // if (response.val() != null) { 
     //  $scope.$evalAsync(function() { 
     //   $scope.planner = response.val(); 
     //  }) 
     // } 
     // }); 
    } else { 
     console.log('No user logged in'); 
     $scope.user = null; 
     if ($scope.planner && angular.isFunction($scope.planner.$destroy)) { 
      $scope.planner.$destroy(); 
     } 
     $state.go('login'); 
    } 
}); 
相关问题