在控制器中为工厂调用服务

时间:2014-02-24 13:31:55

标签: angularjs factory

调用在我的控制器中使用.factory创建的服务时遇到问题。 代码如下所示。 工厂(app.js):

.factory('Database',function($http){

    return {

      getDatabase: function(){

        var database = {};

        $http.get('http://localhost:3001/lookup').
          success(function(data){

            database.companyInfo = data.info.companyInfo;
            });


          }).
          error(function(data){
            console.log('Error' + data);
          });

        return database;

      }
    };
  })

控制器:

angular.module('webClientApp')
    .controller('MainCtrl', function (Database,Features,$scope,$http) {




        $scope.databaseString = [];
        $scope.quarters = ['Q1','Q2','Q3','Q4'];
        $scope.years = ['2004','2005','2006','2007','2008','2009','2010',
      '2011','2012','2013','2014'];
        $scope.features = Features.getFeatures();
        $scope.database = Database.getDatabase();

        console.log($scope.database);

现在,当我在Firebug中检查元素时,我在GET语句结果之前打印出console.log($scope.database)$scope.database显示为Object {},其中包含所有礼节。 但是,如果我尝试使用console.log($scope.database.companyInfo),我会得到一个undefined,而我应该获得data.info.companyInfo' that I passed from the数据库服务(在本例中为数组)。

这是什么问题?有人能帮我吗? (如果您需要澄清,请告诉我..)

2 个答案:

答案 0 :(得分:7)

$ http.get()调用是异步的,并使用了promise对象。因此,根据您提供的代码,在服务中运行成功方法之前,您最有可能输出$ scope.database。

我构建了所有服务方法以传递成功或失败功能。这将是服务:

.factory('Database',function($http){

return {

  getDatabase: function(onSuccuess,onFailure){

    var database = {};

    $http.get('http://localhost:3001/lookup').
      success(onSuccess).
      error(onFailure);

  }
 };
})

这将是控制器代码:

angular.module('webClientApp')
    .controller('MainCtrl', function (Database,Features,$scope,$http) {


$scope.databaseString = [];
$scope.quarters = ['Q1','Q2','Q3','Q4'];
$scope.years = ['2004','2005','2006','2007','2008','2009','2010',
      '2011','2012','2013','2014'];
$scope.features = Features.getFeatures();
Database.getDatabase(successFunction,failureFunction);

successFunction = function(data){
    $scope.database = data.info.companyInfo;
    console.log($scope.database);
});

failureFunction = function(data){
     console.log('Error' + data);
}

答案 1 :(得分:3)

按以下方式更改您的代码:

.factory('Database',function($http){
  return {
     getDatabase: function(){
        return $http.get('http://localhost:3001/lookup');
     }
  };
})

然后在控制器(Promise chain)中获得响应

Database.getDatabase()
   .then(function(data){
      //assign value
   })
   .catch(function(){
   })
相关问题