Аргумент 'fn' не является функцией полученной строки

У меня есть часть моего приложения angular, на которое я привязал контроллер,
с тех пор я получил аргумент "fn" не является функцией Error, может ли кто-нибудь просмотреть мой код и объяснить, почему я получил эту ошибку?

Я был бы очень благодарен:)

HTML-разметка:

        <section class="col-lg-12" data-ng-controller="MessageController">
            <fieldset>
                <legend>{{ 'MESSAGES' | translate }}</legend>
            </fieldset>
            <div class="margin-left-15">
                <ul class="list-style-button">
                    <li data-ng-repeat="message in MSG">{{ message }}</li>
                </ul>
            </div>
        </section>

контроллер:

(function () {
'use strict';

var controllers = angular.module('portal.controllers');

controllers.controller('MessageController',['$scope','MessageService','$rootScope', function MessageController($scope, MessageService, $rootScope){
    $rootScope.MSG = MessageService.getMessages();

    $rootScope.$watch('MSG', function(newValue){
        $scope.MSG = newValue;
    });
 }]);
}());

Услуги:

(function(){

'use strict';

var messageServices = angular.module('portal.services');

messageServices.factory('MessageService', ['MessageData','localStorageService', 'UserService'], function(MessageData, localStorageService, UserService){
    return new MessageService(MessageData, localStorageService, UserService);
});

function MessageService(MessageData, localStorageService, UserService){
    this.messageData = MessageData;
    this.localStorageService = localStorageService;
    this.userService = UserService;
}

MessageService.prototype.getMessages = function(){
    var locale = this.userService.getUserinfoLocale();
    var messages = this.localStorageService.get(Constants.key_messages+locale);
    if(messages !== null && messages !== undefined){
        return JSON.parse(messages);
    } else {
        return this.messageData.query({locale: locale}, $.proxy(function(data, locale){
            this.save(Constants.key_messages+locale, JSON.stringify(data));
        }, this));
    }
};

MessageService.prototype.save = function(key, value){
    this.localStorageService.add(key, value);
};

}());

Данные:

(function(){
'use strict';

var data = angular.module('portal.data');

data.factory('MessageData', function($resource){
    return $resource(Constants.url_messages,{},{
        query: {method: 'GET', params: {locale: 'locale'}, isArray: true}
    });
});
}());

порядок js файлов в html-заголовке:

<script src="js/lib/jquery-1.10.js"></script>
<script src="js/lib/angular.js"></script>
<script src="js/lib/angular-resource.js"></script>
<script src="js/lib/angular-translate.js"></script>
<script src="js/lib/angular-localstorage.js"></script>
<script src="js/lib/jquery-cookies.js"></script>
<script src="js/lib/bootstrap.js"></script>
<script src="js/portal.js"></script>

Ответ 1

Проблема заключалась в использовании "неправильного" синтаксиса для создания сервиса
вместо использования:

messageServices.factory('MessageService', 
    ['MessageData','localStorageService', 'UserService'], 
    function(MessageData, localStorageService, UserService){
        return new MessageService(MessageData, localStorageService, UserService);
    }
);

Мне пришлось использовать:

messageServices.factory('MessageService', 
    ['MessageData','localStorageService', 'UserService', 
    function(MessageData, localStorageService, UserService){
        return new MessageService(MessageData, localStorageService, UserService);
    }
]);

Я скоро закрыл массив параметрами, и, поскольку я все еще участвую, я не видел его напрямую, так или иначе, я надеюсь, что смогу помочь другим, которые спотыкаются на это.

Ответ 2

Сегодня я получил такую ​​же ошибку, совершая эту глупую ошибку:

(function(){

  angular
    .module('mymodule')
    .factory('myFactory', 'myFactory');   // <-- silly mistake 

  myFactory.$inject = ['myDeps'];
  function myFactory(myDeps){
    ...
  }

}());

вместо этого:

(function(){

  angular
    .module('mymodule')
    .factory('myFactory', myFactory);   // <-- right way to write it    

  myFactory.$inject = ['myDeps'];
  function myFactory(myDeps){
    ...
  }

}());

Фактически строка "myFactory" была доставлена ​​в инжектор, который ждал функцию, а не строку. Это объясняет ошибку [ng: areq].

Ответ 3

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

В свое время мое клиентское приложение конкатенируется и минимизируется, поэтому я пишу Angular специально, чтобы избежать связанных с этим проблем. Я определяю свой config следующим образом

config.$inject = [];
function config() {
    // config stuff
}

(Я определяю функцию, $inject это как модуль и объявляю, что это такое).

И затем я попытался зарегистрировать config так же, как я зарегистрировал другие модули в своем приложении (контроллеры, директивы и т.д.).

angular.module("app").config('config', config); // this is bad!

// for example, this is right
angular.module("app").factory('mainService', mainService);

Это неправильно и дал мне вышеупомянутую ошибку. Поэтому я перешел на

angular.module("app").config(config);

И это сработало. Я думаю, что разработчики Angular предполагали config иметь уникальный экземпляр и поэтому иметь Angular не принимать имя при регистрации config.

Ответ 4

У меня была такая же проблема, и в моем случае проблема была в файле angular -cookies.js. Это было в папке с другими скриптами angularjs, и когда я использовал gulp для минимизации моих js файлов, произошла ошибка.

Простое решение состояло в том, чтобы поместить файл angular -cookies.js в другую папку за пределами выбранной папки, чтобы минимизировать js файлы.