2014-08-31 130 views
0

我不知道如何将数据从控制器作为方法参数传递给服务...我需要在控制器中设置标头变量,稍后将其添加到服务中,这以后到HTTP调用AngularJS从控制器传递参数到服务

控制器

angular.module('userControllers', []). 
    controller('userController', ['$scope', '$q', 'Users', '$location', 
     function($scope, $q, Users, $location) { 

      $scope.viewUser = function(userId) { 
       $location.path('/users/'+userId); 
      }; 

      $scope.createUser = function() { 
       $location.path('/users/create'); 
      }; 

      headers = {service:'json',resource:'users'}; 
      $scope.users = Users.query(headers); 
      $scope.users.$promise.then(function(result){ 
       $scope.users = result; 
      }); 

     }]); 

服务

angular.module('userServices', ['ngResource']). 
    factory('Users', ['$resource', '$q', function($resource, $q){ 
     var factory = { 
      query: function (headerParams) { 
       var data = $resource('http://localhost:8080/gateway', {}, { 
        query: { 
         method: 'GET', 
         isArray: true, 
         headers: headerParams 
        } 
       }); 
       var deferred = $q.defer(); 
       deferred.resolve(data); 
       return deferred.promise; 
      } 
     } 
     return factory; 
    }]); 

在此设置中我得到错误:[$注射器:unpr]未知提供商:UserProvider < - 用户......真的不知道如何解决这一个...

后来编辑:代码清理.. 。发布完整的代码和新的错误

TypeError: Cannot read property 'then' of undefined 
at new <anonymous> (http://localhost/frontend-pdi-angular-js/js/controllers/users.js:16:38) 
at invoke (https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:3918:17) 
at Object.instantiate (https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:3929:23) 
at https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:7216:28 
at link (https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular-route.js:913:26) 
at nodeLinkFn (https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:6648:13) 
at compositeLinkFn (https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:6039:13) 
at publicLinkFn (https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:5934:30) 
at boundTranscludeFn (https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:6059:21) 
at controllersBoundTransclude (https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js:6669:18) <div ng-view="" class="ng-scope"> 

后来编辑#2:一些工作的代码,但不使用任何ngResource

angular.module('userControllers', ['userServices']). 
    controller('userController', 
     ['$scope', '$q', 'Users', '$location', '$http', 
      function($scope, $q, Users, $location, $http) { 
       headerParams = {service:'json',resource:'users'}; 
       $scope.users = $http({method: 'GET', url: 'http://localhost:8080/gateway', headers: headerParams, isArray:true}). 
        success(function(data, status, headers, config) { 
         $scope.users = data; 
         console.log(data); 
        }). 
        error(function(data, status, headers, config) { 
         console.log(status); 
        }); 
      }]); 
+0

什么是您在控制器定义中定义的用户?你可以显示服务代码以及 – V31 2014-08-31 12:29:44

+0

oops ...忘了从控制器中删除它...我需要编辑这个问题,因为我得到了另一个错误TypeError:无法读取属性'then'的undefined (当到达与$ scope.users。$ promise.then(...) – 2014-08-31 12:33:18

+0

行检查是否可能的解决方案https://stackoverflow.com/questions/24788171/typeerror-cannot-read-property-then- undefined – 2014-08-31 12:37:07

回答

1

正如其他人提到的,您在代码中使用了不存在的对提供程序($ promise)的引用。通过简单地将延迟设置为$ scope.users,然后对延迟的'then'进行操作,就可以解决这个问题。

你也可以简化一下。您将$ scope对象设置为延迟,然后用覆盖已解析的延迟值来覆盖它。如果你想分配推迟到一个单独的变量

Users.query(headers).then(function(result){ 
     $scope.users = result; 
}); 

:所以,你可以做到这一点,而不是

var deferred = Users.query(headers); 
deferred.then(function(result){ 
     $scope.users = result; 
}); 
+0

$ scope.users是未定义的...从我的后端数据出来和工作之前,我需要更改代码接受额外的参数 – 2014-08-31 13:06:50

+0

不知道你的意思。这仍然不起作用? – sma 2014-08-31 14:25:37

+0

该视图没有填充...不知道为什么......在尝试这些更改之前,我在视图中看到了数据...如果我通过$ http发出请求....它可以工作......但至少使用你的代码我摆脱了最初的错误,但...另一个问题出现了......也许这是一个单独的问题的主题... – 2014-08-31 14:36:11

0

与此代码替换控制器:

angular.module('userControllers', []). controller('userController', ['$scope', '$q', 'Users', '$location', function($scope, $q, Users, $location) { 

     $scope.viewUser = function(userId) { 
      $location.path('/users/'+userId); 
     }; 

     $scope.createUser = function() { 
      $location.path('/users/create'); 
     }; 

     headers = {service:'json',resource:'users'}; 
     Users.query(headers).$promise.then(function(result){ 
      $scope.users = result; 
     }); 

    }]); 

和工厂使用此代码:

angular.module('userServices', ['ngResource']). 
    factory('Users', ['$resource', '$q', function($resource, $q){ 
     var factory = { 
      query: function (headerParams) { 

         return $resource('http://localhost:8080/gateway', {}, { 
        query: { 
         method: 'GET', 
         isArray: true, 
         headers: headerParams 
        } 
       }) 


      } 
     } 
     return { 
     query: factory.query 
     } 
    }]); 

我认为这会帮助你。

+0

该调用现在可用...但没有数据发送到视图... $ scope.users未定义 – 2014-08-31 13:03:24

+0

我认为它现在可以工作 – 2014-08-31 13:25:34

+0

TypeError:无法读取未定义的属性'then'...我写了一个手动$ http.get(...)调用,数据即将到来...但是我需要弄清楚视图方面是否有问题...所以我也会添加视图代码以及 – 2014-08-31 13:31:07

0
angular.module('userControllers', ['userServices']). 
controller('userController', 
    ['$scope', '$q', 'Users', '$location', 
     function($scope, $q, Users, $location) { 
      headers = {service:'json',resource:'users'}; 
      Users.query(headers).then(function(result){ 
       $scope.users = result; 
      }); 

     }]) 

angular.module('userServices', ['ngResource']). 
factory('Users', ['$resource', '$q', function($resource, $q){ 
    var factory = { 
     query: function (headerParams) { 
      var data = $resource('http://localhost:8080/gateway', {}, { 
       query: { 
        method: 'GET', 
        isArray: true, 
        headers: headerParams 
       } 
      }); 
      var deferred = $q.defer(); 
      deferred.resolve(data); 
      return deferred.promise; 
     } 
    } 
    return factory; 
}]); 

试试这个。您不包含userServices模块到userControllers模块,您可以省略$scope.users = Users.query(headers);部分,因为如果您将此设置调用查询方法。

+0

与其他评论中描述的相同问题...我现在想弄清楚为什么$ scope.users未定义... – 2014-08-31 13:12:42

相关问题