【问题标题】:Retrieving Data from AngularFire从 AngularFire 检索数据
【发布时间】:2015-12-11 09:43:48
【问题描述】:

我正在尝试使用服务从 Angularfire 检索数据,然后将返回值设置为我的控制器中的范围。

当我运行下面的代码时,我得到未定义的 scope.sessions。

服务:

app.factory('sessions', function(){

var refToSessions = new Firebase('myFireBaseURL');
var allSessions = [];

return {
getSessions: function () {
  refToSessions.on("value", function (sessions) {
    allSessions.push(sessions.val());
    return allSessions;
  });
}

}; });

控制器:

app.controller('SessionsCtrl', ['$scope', '$state', 'Auth', 'sessions', function($scope, $state, Auth, sessions){
  $scope.sessions = sessions.getSessions();

$scope.submitSession = function() {
console.log($scope.sessions);
}
});

【问题讨论】:

    标签: javascript angularjs firebase angularfire


    【解决方案1】:

    您正在尝试返回异步数据。

    在从 Firebase 下载数据之前,您正在将 allSessions 记录到控制台。

    使用来自AngularFire$firebaseArray

    app.constant('FirebaseUrl', '<my-firebase-url>');
    app.service('rootRef', ['FirebaseUrl', Firebase);
    app.factory('Sessions', function(rootRef, $firebaseArray){
      var refToSessions = ref.child('sessions');
      return $firebaseArray('sessions');
    }
    

    然后将Sessions 注入到您的控制器中:

    app.controller('SessionsCtrl', function($scope, $state, Auth, Sessions){
      $scope.sessions = Sessions; // starts downloading the data
    
      console.log($scope.sessions); // still empty
    
      $scope.submitSession = function() { 
        // likely by the time you click here it will be downloaded
        console.log($scope.sessions);
        $scope.sessions.$add({ title: 'new session' });
      };
    });
    

    数据一旦注入您的控制器就会开始下载。下载后$firebaseArray知道触发$digest,所以出现在页面上。

    由于您使用的是ui-router,因此您可以使用resolve 在将数据注入控制器之前确保数据存在:

    app.config(function ($stateProvider) {
      $stateProvider
        .state("session", {
          controller: "SessionsCtrl",
          templateUrl: "views/sessions.html",
          resolve: {
            sessions: function(Sessions) {
              // return a promise that will fulfill the data
              return Sessions.$loaded(); 
            }
          }
        })
    });
    

    现在您将控制器代码更改为:

    app.controller('SessionsCtrl', function($scope, $state, Auth, sessions){
      $scope.sessions = sessions; // data is available since injected by router
    
      console.log($scope.sessions); // logs the appropriate data
    
      $scope.submitSession = function() { 
        $scope.sessions.$add({ title: 'new session' });
      };
    });
    

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多