2016-08-13 74 views
2

我想从我的http服务向我的控制器发送数据。该服务正确地获取数据,但它不会发送到控制器。如何正确地将数据从服务传递到控制器

现在,我知道查询是异步完成的,这就是为什么我要使用$ q.defer。 我试着按照类似问题提供的示例:AngularJS $http call in a Service, return resolved data, not promises,但它仍然无法正常工作。

这里是我的服务:

.service("builds", ['$http', '$q', function($http, $q) { 
    var deferred = $q.defer(); 

    $http({ 
     method:'GET', 
     url: '/builds', 
     cache : true 
    }).success(function(data) { 
     deferred.resolve(data); 
    }).error(function(msg){ 
     deferred.reject(msg); 
    }); 
    console.log(deferred.promise); 
    return deferred.promise;}]); 

这里是我的routeProvider

$routeProvider. 
    when('/builds', { 
     controller: ['$scope', 'buildsData', function ($scope, buildsData) { 
      console.log("In routeprovider:" + buildsData); 
      $scope.allBuilds = buildsData; 
     }], 
     template: '<build-list></build-list>', 
     resolve: { 
      buildsData: ['builds', function(builds){ 
       return builds; 
      }] 
     } 
    }) 

最后这里是我的控制器的一个片段:

var app = angular. 
module('buildList'). 
    component('buildList', { 
    templateUrl: 'build-list/build-list.template.html', 
    controller: function BuildListController($scope, $window,$location,$cookies, builds) { 
    console.log($scope.allBuilds); 
    $scope.league = $scope.allBuilds; 
+0

你必须调用服务从控制器获取数据。创建一个封装该逻辑的服务方法,然后从ctrl调用该方法。 –

回答

2

正如@vishal所说

你应该在服务中创建一个方法,因为通常服务可能有许多get和set方法(我的意思是最佳实践)。

创建一个函数说的getData

function getData() 
{ 
    $http({ 
     method:'GET', 
     url: '/builds', 
     cache : true 
    }) 
} 

,那么你应该调用控制器

这种方法在控制器,你应该注入该服务,然后

builds.getData().then(function(s){ 
//result 

},function(e){ 

//error 
} 
); 
+0

谢谢,我的工作就像你说的那样。但有一个问题:数据被请求两次......一旦加载页面(可能从我的routeProvider触发getBuilds()),并且第二次当我在我的控制器中调用getBuilds()。我不应该在routeProvider中调用getBuilds()吗?这似乎是合乎逻辑的事情,但我似乎并没有在任何地方使用这些数据...... – Storm

+0

更新no2:对不起,如果这是越来越冗长。我从我的routeProvider解决方案中删除了返回的builds.getBuilds()。现在我的网站立即加载,然后在2-3秒后填入数据。很棒! – Storm

0

你shouldntt有

controller: ['$scope', 'buildsData', function ($scope, buildsData) { 
      console.log("In routeprovider:" + buildsData); 
      $scope.allBuilds = buildsData; 
     }], 

,并在其他文件中的控制器:

您可以直接做

when('/builds', { 
     controller: 'BuildListController' 
     template: '<build-list></build-list>', 
     resolve: { 
      buildsData: ['builds', function(builds){ 
       return builds; 
      }] 
     } 
    }) 

,然后在你的控制器

$scope.allBuilds = buildsData; 

旁边,如果你想添加一些功能吧,你的服务应该看起来像这样:

.service("builds", ['$http', '$q', function($http, $q) { 

     var deferred = $q.defer(); 

    getbuilds: function(){ 
     $http({ 
      method:'GET', 
      url: '/builds', 
      cache : true 
     }).success(function(data) { 
      deferred.resolve(data); 
     }).error(function(msg){ 
      deferred.reject(msg); 
     }); 
     console.log(deferred.promise); 
     return deferred.promise;}]); 
    } 
+0

我以为只需要$ scope.allBuilds = buildsData;在控制器是不够的。我可以直接调用builds.getBuilds()还是需要一个特殊的函数来确保它在继续之前等待接收数据? – Storm

+0

服务不是功能,但可以将其视为功能的集合。所以你必须像@saiyan所说的那样叫 – DMCISSOKHO

相关问题