Ошибка ввода фабрики Angularjs

Я использую angularJS, и когда я внедряю Factory, я получаю сообщение об ошибке:

app.js:

angular.module('myapp', [])

myfactory.js:

angular.module('myapp', [])
.factory('httpService', function($http, $timeout) {

});

Контроллер: test.js :

angular.module('myapp', [])
.controller('test',  function($scope, $timeout, $sce, $http, httpService) {

  $scope.submit = function() {
  }
});

Когда я добавляю httpService, я получаю сообщение об ошибке. Вроде все правильно, я даже использую эту фабрику во всех проектах. Ошибка:

angular.min.js:92 Error: [$injector:unpr] http://errors.angularjs.org/1.2.25/$injector/unpr?p0=httpServiceProvider%20%3C-%20httpService
at Error (native)
at http://localhost:81/chah/assets/js/angularjs/angular.min.js:6:450
at http://localhost:81/chah/assets/js/angularjs/angular.min.js:36:202
at Object.c [as get] (http://localhost:81/chah/assets/js/angularjs/angular.min.js:34:305)
at http://localhost:81/chah/assets/js/angularjs/angular.min.js:36:270
at c (http://localhost:81/chah/assets/js/angularjs/angular.min.js:34:305)
at d (http://localhost:81/chah/assets/js/angularjs/angular.min.js:35:6)
at Object.instantiate (http://localhost:81/chah/assets/js/angularjs/angular.min.js:35:165)
at http://localhost:81/chah/assets/js/angularjs/angular.min.js:67:419
at http://localhost:81/chah/assets/js/angularjs/angular.min.js:54:25

person Vahid Najafi    schedule 19.05.2016    source источник
comment
какую версию Angular вы используете?   -  person Shushanth Pallegar    schedule 19.05.2016
comment
@shushanthp Я тестировал как angular 1.2.25, так и 1.3.9.   -  person Vahid Najafi    schedule 19.05.2016


Ответы (4)


Проверьте ссылку в вашей ошибке (https://docs.angularjs.org/error/$injector/unpr?p0=httpServiceProvider %20%3C-%20httpService):

Вы создаете модуль несколько раз:

angular.module('myapp', [])

Вы должны сделать это один раз. Затем используйте без []

angular.module('myapp').factory ...
angular.module('myapp').controller ...
person Mary    schedule 19.05.2016

Причина ошибки в том, что при создании httpService и controller вы использовали синтаксис setter, т.е. angular.module('myapp', []) для module, а не синтаксис getter. angular.module('myapp'). Angular требует, чтобы мы определили модуль только один раз, поэтому последующее переопределение вызывает ошибку.

Итак, в app.js определите module:

angular.module('myapp', []) ;

В myfactory.js используйте синтаксис getter, удалив , []:

angular.module('myapp')
.factory('httpService', function($http, $timeout) {
});

И в test.js:

angular.module('myapp')
.controller('test',  function($scope, $timeout, $sce, $http,  httpService) {

$scope.submit = function() {
}
});

Вот ссылка на документы.

person Evans Dianga    schedule 19.05.2016

да,

то, что вы делаете, воссоздает ваше приложение

что вам нужно сделать, это определить его один раз и продолжить использовать этот экземпляр

var app = angular.module('myapp', []);

app.factory('httpService', function($http, $timeout) {

});

app.controller('test',  function($scope, $timeout, $sce, $http, httpService) {

  $scope.submit = function() {
  }
});

или если вы хотите получить свое приложение, синтаксис angular.module('myapp') возвращает 'myapp', но добавление [], сообщает angular создать приложение, а не извлекать его

person WalksAway    schedule 19.05.2016
comment
Существуют разные файлы js, как указано в вопросе, - person Shushanth Pallegar; 19.05.2016
comment
не имеет значения... вы можете определить window.app =... и затем продолжить использовать эту переменную, или, как я утверждаю, вы можете использовать angular.module('myapp') для получения вашего приложения, но правильным способом или, по крайней мере, как мне нравится это делать, так это продолжать использовать эту переменную - person WalksAway; 19.05.2016
comment
окно является глобальным, если оно не используется с IIFE - person Shushanth Pallegar; 19.05.2016
comment
@shushanthp - ну и что? Не имеет значения, пока отдельные файлы загружаются в правильном порядке. - person Starscream1984; 19.05.2016
comment
да Это не имеет значения, но синтаксис, используемый в вопросе, также работает, вам не нужно кэшировать переменную, поскольку речь идет о модульности приложения. - person Shushanth Pallegar; 19.05.2016
comment
@shushanthp - не уверен, что вы имеете в виду, но синтаксис в вопросе не работает, он использует установщик модулей несколько раз. - person Starscream1984; 19.05.2016
comment
синтаксис будет работать, если вы удалите параметр «[]», но, насколько это рекомендуется, вы должны определить переменную, а затем загрузить файлы в правильном порядке. - person WalksAway; 19.05.2016
comment
не определяйте переменную «приложение», это плохая практика. вместо этого используйте angular.module('myapp', []) ;, чтобы определить новый модуль, и angular.module('myapp')., чтобы использовать его в других файлах или коде. см. ответ @Evans Dianga, пожалуйста - person AlainIb; 19.05.2016
comment
Я имел в виду плохую практику использования переменной приложения, вопрос правильно использовал угловой модуль в разных файлах, нет необходимости использовать переменную приложения. - person Shushanth Pallegar; 19.05.2016

Код должен выглядеть следующим образом:

angular.module('myapp', [])
.factory('httpService', function($http, $timeout) {

});
.controller('test',  function($scope, $timeout, $sce, $http, httpService) {

  $scope.submit = function() {
  }
});
person Suneet Bansal    schedule 19.05.2016