我声明了以下服务:
app.factory('data', ['$http', function ($http) {
var dataRecords = {};
//Retrieve the entries from the data file and categorize them according
//to the information types located in the overview page
$http.get('data.json')
.success(function (records) {
//Fill the dataRecords variable
});
return {
get: function () {
return dataRecords;
},
setNew: function (newRecords) {
dataRecords = newRecords;
}
};
}]);
可以看出,使用$http
我从data.json文件中获取数据。现在我的问题是,当我调用数据服务的get
方法时,即使data.json不为空,我也会返回空记录。
据我所知,$http.get()
将会有一些延迟返回数据,因此当我调用get时,它仍然没有被填充,因此我得到空值。
当我从服务中提取数据时,如何调用服务并确保数据已填满?
答案 0 :(得分:1)
你做错了。我认为正确的方法是:
app.factory('MyService', ['$http', function ($http) {
var dataRecords = {};
return {
get: function (success) {
$http.get('data.json').success(success) {});
}
};
}]);
并称之为
MyService.get(function(response) {
//on success
});
因此,您希望使用http.get初始化您的服务。这不是一件容易的事。但是在SO上已经存在这样的问题:AngularJS : Initialize service with asynchronous data
但是你也可以这样做:
app.factory('MyService', ['$http', function ($http) {
var myService = {};
myService.get = function () {
return myService.records;
}
myService.load = function(){
$http.get('data.json').success(function(response){
myService.records = response;
return myService.records;
}) {});
}
return myService;
}]);
在控制器中:
if(typeof MyService.get() === 'undefined'){
$scope.records = MyService.load();
}
在控制器初始化时,数据将被提取一次。
答案 1 :(得分:1)
继续@ artowrkad的例子,如果你只想让它只获得一次,那么只需要实现逻辑就不要再这样了:
app.factory('MyService', ['$http', function ($http) {
var dataRecords = false;
return {
get: function (successCallback) {
if(!dataRecords){
$http.get('data.json').success(function(data){
dataRecords = data;
successCallback(data);
));
}
else{
successCallback(dataRecords);
}
}
};
}]);
你甚至可以改进它,这样如果你在第二次调用等待时运行$ http.get,然后在完成后进行回调。