这是我的控制器和服务:
var app = angular.module('myApp', ['ui.bootstrap']);
app.service("BrandService", ['$http', function($http){
this.reloadlist = function(){
var list;
$http.get('/admin.brands/getJSONDataOfSearch').
success(function(data, status, headers, config) {
list = data;
}).
error(function(data, status, headers, config) {
});
return list;
};
}]);
app.controller('BrandsCtrl', ['$scope','$http','$controller','BrandService', function($scope, $http, $controller, BrandService) {
$scope.brands = BrandService.reloadlist();
angular.extend(this, $controller("BrandCtrl", {$scope: $scope}));
}]);
我搜索了这个问题并尝试了问题的答案,但我无法得到解决方案。我是棱角分明的新人,你能解释一下细节;为什么我无法通过这种方式将数据从服务转移到控制器?
答案 0 :(得分:1)
它不是有角度的,它是Javascript。您放在this.reloadlist
中的函数不会返回任何值。它根本没有返回,因此返回的值将为undefined
。成功处理程序确实会返回一些内容,但它会在reloadlist
完成工作后很长时间运行。
答案 1 :(得分:1)
用于数据的返回是用于函数的回调。 您必须使用$ http返回的承诺。
在您的服务中返回承诺:
return $http.get('/admin.brands/getJSONDataOfSearch').
success(function(data, status, headers, config) {
return data;
}).
error(function(data, status, headers, config) {
});
对控制器中的承诺使用then()
:
BrandService.reloadlist()
.then(function (data){
$scope.brands = data;
});
答案 2 :(得分:1)
除了@fdreger已经指出的内容(缺少返回值),$http.get(...)
是异步方法。返回值是promise而不是实际值。
要访问该值,您需要将其从reloadlist
返回,如下所示:
this.reloadList = function() {
return $http.get('/admin.brands/getJSONDataOfSearch');
// you need to handle the promise in here. You could add a error handling here later by catching stuff...
}
在控制器中,您可以将其添加到$scope
,如下所示:
BrandService
.reloadlist()
.then(function(res) {
$scope.brands = res.data;
});
一旦HTTP请求成功完成,就会调用传递给then()
的回调,这会使调用异步。
除了承诺the article on MDN的角度文档也是一个很好的阅读。