Angularjs — фабрика не определена

Я разрабатываю приложение с использованием MVC и angularjs и очень новичок в angularjs. В коде используется много разных фабрик, определенных в отдельных файлах js, и эти фабрики правильно вводятся в модули, но все же я вижу «ошибка фабрики не определена»

Приложение app.js находится ниже: -

(function () {
          'use strict';

         angular.module('MyApp', ['common.core', 'common.ui'])
           .run(run);

          run.$inject = ['$rootScope', '$location', '$cookieStore',         '$http','membershipService'];

        function run($rootScope, $location, $cookieStore, $http) {
            // handle page refreshes
            $rootScope.repository = $cookieStore.get('repository') || {};
            if ($rootScope.repository.loggedUser) {
                $http.defaults.headers.common['Authorization'] = $rootScope.repository.loggedUser.authdata;
            }
        }
    })();

Фабрика определяется в отдельном файле следующим образом: -

 (function (app) {
        'use strict';

        var app = angular.module('MyApp');
        app.factory('membershipService', membershipService);

        membershipService.$inject = ['apiService', 'notificationService','$http', '$base64', '$cookieStore', '$rootScope'];

        function membershipService(apiService, notificationService, $http, $base64, $cookieStore, $rootScope) {

            var service = {
                login: login,
                register: register,
                saveCredentials: saveCredentials,
                removeCredentials: removeCredentials,
                isUserLoggedIn: isUserLoggedIn
            }

            function login(user, completed) {
                apiService.post('/api/account/authenticate', user,
                completed,
                loginFailed);
            }

            function register(user, completed) {
                apiService.post('/signup', user,
                completed,
                registrationFailed);
            }

            function saveCredentials(user) {
                var membershipData = $base64.encode(user.username + ':' + user.password);

                $rootScope.repository = {
                    loggedUser: {
                        username: user.username,
                        authdata: membershipData
                    }
                };

                $http.defaults.headers.common['Authorization'] = 'Basic ' + membershipData;
                $cookieStore.put('repository', $rootScope.repository);
            }

            function removeCredentials() {
                $rootScope.repository = {};
                $cookieStore.remove('repository');
                $http.defaults.headers.common.Authorization = '';
            };

            function loginFailed(response) {
                notificationService.displayError(response.data);
            }

            function registrationFailed(response) {

                notificationService.displayError('Registration failed. Try again.');
            }

            function isUserLoggedIn() {
                return $rootScope.repository.loggedUser != null;
            }

            return service;
        }
    })(angular.module('common.core'));

Контроллер определяется следующим образом:

(function (app) {
    'use strict';
    var app = angular.module('MyApp');
    app.controller('SignUpController', SignUpController);

    SignUpController.$inject = ['$scope', 'membershipService', 'notificationService', '$rootScope', '$location'];

      function SignUpController($scope, membershipService, notificationService, $rootScope, $location) {
            $scope.pageClass = 'page-login';
            $scope.register = register;
            $scope.user = {};
        };

        function register() {
            membershipService.register($scope.user, registerCompleted)
        }

        function registerCompleted(result) {
            if (result.data.success) {
                membershipService.saveCredentials($scope.user);
                notificationService.displaySuccess('Hello ' + $scope.user.username);
                $scope.userData.displayUserInfo();
                $location.path('/');
            }
            else {
                notificationService.displayError('Registration failed. Try again.');
            }
        }
    })(angular.module('common.core'));   

Скрипт загружается, как показано ниже: -

bundles.Add(new ScriptBundle("~/bundles/Controllers").Include(
              "~/Scripts/Controllers/app.js",
              "~/Scripts/Services/apiService.js",
              "~/Scripts/Services/notificationService.js",
              "~/Scripts/Services/membershipService.js",
              "~/Scripts/Services/fileUploadService.js",
              "~/Scripts/Controllers/SignUpController.js"

Функция «регистрация» выдает ошибку «служба членства не определена», что я делаю неправильно? Пожалуйста помоги.


person AjS    schedule 12.02.2016    source источник


Ответы (1)


Я вижу это:

run.$inject = ['$rootScope', '$location', '$cookieStore', '$http','membershipService'];

 function run($rootScope, $location, $cookieStore, $http) {
       // handle page refreshes

Вам не хватает membershipService в списке параметров функции.

Также это:

    SignUpController.$inject = ['$scope', 'membershipService', 'notificationService', '$rootScope', '$location'];

    function SignUpController($scope, membershipService, notificationService, $rootScope, $location) {
        $scope.pageClass = 'page-login';
        $scope.register = register;
        $scope.user = {};
    };

    function register() {
        membershipService.register($scope.user, registerCompleted)
    }

    function registerCompleted(result) {
        if (result.data.success) {
            membershipService.saveCredentials($scope.user);
            notificationService.displaySuccess('Hello ' + $scope.user.username);
            $scope.userData.displayUserInfo();
            $location.path('/');
        }
        else {
            notificationService.displayError('Registration failed. Try again.');
        }
    }

Это никогда не сработает, потому что вы определяете функцию вне функции, в которую вы передаете membershipService.

SignUpController должно выглядеть примерно так:

        function SignUpController($scope, membershipService, notificationService, $rootScope, $location) {
            $scope.pageClass = 'page-login';
            $scope.register = register;
            $scope.user = {};

            function register() {
                membershipService.register($scope.user, registerCompleted)
            }

            function registerCompleted(result) {
                if (result.data.success) {
                    membershipService.saveCredentials($scope.user);
                    notificationService.displaySuccess('Hello ' + $scope.user.username);
                    $scope.userData.displayUserInfo();
                    $location.path('/');
                }
                else {
                    notificationService.displayError('Registration failed. Try again.');
                }
            }
        };

Смотрите, в вашем методе SignUpController именно здесь DI будет вводить параметры.

Однако вы определили функции, которым требуются эти параметры ВНЕ области действия функции SignUpController.

person Callum Linington    schedule 12.02.2016
comment
Ой! Спасибо, позвольте мне попробовать. Спасибо еще раз - person AjS; 12.02.2016
comment
@AjS как у тебя дела? - person Callum Linington; 12.02.2016
comment
Сейчас я не вижу ошибки, но не могу вызвать сервисный метод с завода; это все-таки другой вопрос. Большое спасибо за твою помощь! Очень признателен! - person AjS; 12.02.2016