调用在我的控制器中使用.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
数据库服务(在本例中为数组)。
这是什么问题?有人能帮我吗? (如果您需要澄清,请告诉我..)
答案 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(){
})