2016-02-12 120 views
0

我正在開發一個應用程序使用MVC和angularjs和非常新的angularjs。該代碼使用很多不同的js文件中定義不同的工廠和那些工廠模塊正確注射,但仍然我看到「工廠沒有定義錯誤」Angularjs - 工廠是undefined

的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" 

的「註冊」功能將拋出一個錯誤「membershipservice沒有定義」,我在做什麼錯?請幫忙。

回答

2

我看到這一點:

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功能範圍功能

+0

糟糕!謝謝,讓我試試看。再次感謝 – AjS

+0

完全沒問題! –

+0

@AjS你怎麼了? –