2014-08-31 2 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

+0

oops ... забыл удалить это из контроллера ... мне нужно немного отредактировать вопрос, потому что я получаю еще одну ошибку TypeError: не могу прочитать свойство «then» неопределенного (при достижении строки с $ scope.users. $ prom.then (...) –

+0

проверка, является ли это возможным решением https://stackoverflow.com/questions/24788171/typeerror-cannot-read-property-then- of-undefined –

ответ

1

Как уже упоминалось, вы используете несуществующую ссылку на поставщика ($ обещание) в своем коде. Просто устанавливая отложенные на $ scope.users, а затем действуя на «потом» отложенного, вы можете решить эту проблему.

Вы также можете немного упростить его. Вы устанавливаете отложенный объект $ 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 не определено ... данные из моего бэкэнда выходят и работают до того, как мне нужно изменить код, чтобы принять дополнительные аргументы –

+0

Не уверен, что вы имеете в виду. Это еще не работает? – sma

+0

вид не заполнен ... не уверен, почему ... перед тем, как попробовать эти изменения, я увидел данные в представлении ... если я сделаю запрос через $ http .... он работает ... но, по крайней мере, используя ваш код я избавился от первоначальной ошибки, но ... появилась другая проблема ... может быть, это тема отдельного вопроса ... –

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 не определено –

+0

@ cristi _b использует отредактированный код. Я думаю, что он будет работать сейчас. –

+0

TypeError: Не могу прочитать свойство «then» undefined ... я написал инструкцию $ http.get (...), и данные идут ... но Мне нужно выяснить, что-то не так на стороне зрения ...поэтому я также добавлю код представления, а также –

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 не определено ... –

Смежные вопросы