从服务中获取数据

时间:2015-06-08 09:13:55

标签: javascript angularjs

这是我的控制器和服务:

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}));
}]);

我搜索了这个问题并尝试了问题的答案,但我无法得到解决方案。我是棱角分明的新人,你能解释一下细节;为什么我无法通过这种方式将数据从服务转移到控制器?

3 个答案:

答案 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的角度文档也是一个很好的阅读。