2016-07-30 93 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'); 
    } 
}); 
相關問題