如何正确地将数据从服务传递到控制器

How to correctly pass data from Service to Controller

本文关键字:控制器 服务 正确地 数据      更新时间:2023-09-26

我正在尝试从我的http服务发送数据到我的控制器。服务正确地获取数据,但它没有被发送到控制器。

现在,我知道查询是异步完成的,这就是为什么我试图使用$q.defer。我试着按照一个类似的问题提供的例子:AngularJS $http调用一个服务,返回解析的数据,而不是承诺,但它仍然不工作。

这是我的服务:

.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;

正如@vishal所说

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

创建函数getData

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

那么你应该在控制器

中调用这个方法

你应该在控制器中注入这个服务,然后

builds.getData().then(function(s){
//result
},function(e){
//error
}
);

你不应该有

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