[英]Why is my service not returning anything
我正在使用Ionic Framework 7 AngularJS构建应用程序
$ ionic info
Your system information:
Cordova CLI: 6.2.0
Gulp version: CLI version 3.9.1
Gulp local:
Ionic Framework Version: 1.2.4
Ionic CLI Version: 1.7.16
Ionic App Lib Version: 0.7.3
OS: Distributor ID: LinuxMint Description: Linux Mint 17.1 Rebecca
Node Version: v0.12.2
我正在构建的页面检索教堂服务列表,并将其显示在主详细信息列表中。 因此,我按照以下代码将$ http代码放入Service中:
services.js:
.service('ServicesService', ['$http', '$sce', function($http, $sce){
var services = [];
$http.get('http://demo0194057.mockable.io/services').then(function(response) {
services = response.data;
window.q = services; //checking value of services var
}, function(error) {
console.error("Error loading Services Endpoint! " + error);
});
return {
getAllServices: function() {
console.log('from inside return obj ' + services);
window.p = services; // checking value of services var
return services;
}
}
}])
controller.js:
.controller('servicesCtrl', function($scope, $http, ServicesService, InfoService) {
$scope.services = [];
$scope.services = ServicesService.getAllServices();
window.r = $scope.services;
$scope.doRefresh = function() {
$http.get('http://demo0194057.mockable.io/services').success(function(response) {
$scope.services = response;
})
.finally(function() {
// stop the ion-refresher from spinning
$scope.$broadcast('scroll.refreshComplete');
});
}
})
所以我的问题是该服务正在返回一个空数组,而不是来自JSON REST API的对象数组。 我在代码中放入了一些调试变量,我可以从控制器看到服务正在返回一个空数组(var window.r)。 在服务中,window.p也为空,但是window.q具有正确的对象数据,这意味着API调用可以正常工作。 我无法弄清楚这些数据在哪里丢失了,以致没有从服务中成功返回。
请帮忙
在您的服务中,您需要在getAllServices
方法的主体内执行$http.get
请求。 否则,在控制器对getAllServices
进行调用之后,将执行get请求的then子句,这就是为什么此时未初始化services
变量的原因。
尝试这样:
服务
.service('ServicesService', ['$http', '$sce', function($http, $sce){
var services = [];
return {
getAllServices: function() {
return $http.get('http://demo0194057.mockable.io/services').then(function(response) {
services = response.data;
return services;
}, function(error) {
console.error("Error loading Services Endpoint! " + error);
});
}
}
}]);
控制者
.controller('servicesCtrl', function($scope, $http, ServicesService, InfoService) {
$scope.services = [];
$scope.doRefresh = function() {
ServicesService.getAllServices().then(function (response) {
$scope.services = response;
});
});
});
$http.get('http://demo0194057.mockable.io/services').then(function(response) {
services = response.data;
window.q = services; //checking value of services var
}, function(error) {
console.error("Error loading Services Endpoint! " + error);
});
这是异步功能。 因此,services = response.data将在稍后的时间执行。
$ scope.services = ServicesService.getAllServices(); 这将在angular上升之后并且可能在异步执行之前被调用。
所以。 如果您不想获得服务,则必须包装ServicesService.getAllServices();。 作为保证,您将在其中等待您的第一个请求。 但是似乎存在一些体系结构问题...尝试将您的代码移开一段时间,然后重新分配它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.