2016-05-17 59 views
2

我試圖構建的是一個登錄服務。 我寫了一個工廠,我需要由每個控制器使用。它用於檢查用戶是否已登錄。但我得到這個錯誤:

Provider must return value from $get factory method 

我是非常新的Angular。這裏是我的索引頁:

<!DOCTYPE html> 
<html ng-app="myApp"> 
    <head> 
     <meta charset="UTF-8"> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 
     <title>Index Page</title> 

     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> 
     <script src="assets/lib/angular.js"></script> 
     <script src="assets/lib/angular-route.js"></script> 

     <script src="app/app.js"></script> 
     <script src="app/AuthenticationService.js"></script> 
    </head> 
    <body> 
     <div ng-view></div> 
    </body> 
</html> 

app.js文件:

(function() { 

    angular.module('myApp', [ 
     'ngRoute', 
     'ngAnimate', 
     'myApp.login', 
     'myApp.home', 
     'myApp.AuthenticationService' 
    ]) 
    .config(['$routeProvider', function($routeProvider) { 
     $routeProvider 
     .when('/login', { 
      controller: 'LoginController', 
      templateUrl: 'loginView.html', 
      controllerAs: 'vm' 
     }) 
     .when('/home', { 
      controller: 'HomeController', 
      templateUrl: 'HomeView.html', 
      controllerAs: 'vm' 
     }) 
     .otherwise({ 
      redirectTo: '/login' 
     }); 
    }]);  
})(); 

這是工廠,我設置:

(function() { 

    angular 
    .module('myApp.AuthenticationService', []) 

    .factory('AuthService', ["$http", "$location", function($http, $location){ 
     var vm = this; 
     vm.checkToken = function(token){ 
      var data = {token: token}; 
      $http.post("endpoints/checkToken.php", data).success(function(response){ 
       if (response === "unauthorized"){ 
        console.log("Logged out"); 
        $location.path('/login'); 
       } else { 
        console.log("Logged In"); 
        return response; 
       } 
      }).error(function(error){ 
       $location.path('/login'); 
      }) 

     } 

    }]); 

    })(); 

And this is how I inject it in a controller: 

(function() { 

    angular 
     .module('myApp.home', []) 

     .controller('HomeController', function($routeParams,AuthService) { 
       var vm = this;  

       //If user is not logged in 
       var token; 
       if (localStorage['token']){ 
       token = JSON.parse(localStorage['token']); 
       } else { 
       token = "something stupid"; 
       } 
       AuthService.checkToken(token); 

       $scope.logout = function(){ 
        var data = { 
         token: token 
        } 

        $http.post('endpoints/logout.php', data).success(function(response){ 
         console.log(response) 
         localStorage.clear(); 
         $state.go("login"); 
        }).error(function(error){ 
         console.error(error); 
        }) 
       } 

     }); 

})(); 

任何人都可以指出我犯的錯?提前致謝。

+0

缺少工廠返回語句: – Sajal

回答

4
.factory('AuthService', ["$http", "$location", function($http, $location){ 
     var vm = this; 
     vm.checkToken = function(token){ 
      var data = {token: token}; 
      $http.post("endpoints/checkToken.php", data).success(function(response){ 
       if (response === "unauthorized"){ 
        console.log("Logged out"); 
        $location.path('/login'); 
       } else { 
        console.log("Logged In"); 
        return response; 
       } 
      }).error(function(error){ 
       $location.path('/login'); 
      }) 

     } 
     return vm; 
    }]); 

角度工廠應該返回一個物體供控制器使用。

+0

'vm'(View Model)在控制器中使用,而不是在Service中使用。另外,我認爲使用'{}'(新對象)而不是'this'會更好,因爲它不會被實例化,並且'this'引用了其他不是預期的內容。 –

0
(function() { 

angular 
.module('myApp.AuthenticationService', []) 

.factory('AuthService', ["$http", "$location", function($http, $location){ 
    var vm = {}; 
    vm.checkToken = function(token){ 
     var data = {token: token}; 
     $http.post("endpoints/checkToken.php", data).success(function(response){ 
      if (response === "unauthorized"){ 
       console.log("Logged out"); 
       $location.path('/login'); 
      } else { 
       console.log("Logged In"); 
       return response; 
      } 
     }).error(function(error){ 
      $location.path('/login'); 
     }) 

    } 

    return vm; 
}]); 

})(); 

以下是更好的方式來創建工廠:

(function() { 

angular 
.module('myApp.AuthenticationService', []) 

.factory('AuthService', ["$http", "$location", function($http, $location){ 

    var vm = { 
     checkToken: checkToken 
    }; 

    function checkToken(token){ 
     var data = {token: token}; 
     $http.post("endpoints/checkToken.php", data).success(function(response){ 
      if (response === "unauthorized"){ 
       console.log("Logged out"); 
       $location.path('/login'); 
      } else { 
       console.log("Logged In"); 
       return response; 
      } 
     }).error(function(error){ 
      $location.path('/login'); 
     }) 

    } 

    return vm; 
}]); 

})(); 
0

這裏的問題是,因爲你沒有在工廠函數返回一個對象。在你的情況,而不是使用.factory(),你需要使用​​。這是因爲你正在使用構造函數(在函數中使用this)。如果你想使用的工廠,你可以做如下:

.factory('AuthService', ["$http", "$location", function($http, $location){ 
    var service = { 
     checkToken: function() {...} 
    }; 

    return service; 
}]) 

您可以按照John Papa Style Guide和喜歡使用的工廠,而不是服務。

相關問題