2014-09-06 95 views
0

我正在使用工廠配方從控制器調用方法,這裏是工廠定義。返回未定義值的工廠方法

app.factory('AccountService', function ($http){ 
    var factory = {}; 

    factory.getAuthenticate = function (credentials) { 
     $http({ 
      method: 'post', 
      url: '/api/login', 
      data: credentials 
     }).success(function (data, status, headers, config){ 
      return true; 
     }).error(function (data, status, headers, config){ 
      return false; 
     }); 
    } 

    return factory; 
}); 

當我打電話從我的控制器的一個getAuthenticate方法,

app.controller('DefaultController', function ($scope, $location, AccountService){ 
    $scope.login = function(){ 
     alert(AccountService.getAuthenticate($scope.credentials)); 
     // if(AccountService.getAuthenticate($scope.credentials)) { 
     //  $location.path('/dashboard'); 
     // } 
    } 
}); 

它總是基於HTTP調用返回undefined,而不是真或假。任何想法我失蹤?

+3

你的函數犯規了一個返回任何東西,第二你是做ASYC呼籲讓你的函數將返回前的AJAX請求完成 – 2014-09-06 04:15:04

+0

[如何從Ajax調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – 2014-09-06 04:16:18

+0

As帕特里克說,異步函數不會返回這樣的值,要麼返回承諾,要麼使用回調。 – 2014-09-06 04:17:34

回答

-1

$ http方法自動返回一個承諾。所以,你應該有一個controller.your代碼來處理這應該是這樣的:

app.factory('AccountService', function ($http){ 
     var factory = {}; 

     factory.getAuthenticate = function (credentials) { 
      return $http({ 
       method: 'post', 
       url: '/api/login', 
       data: credentials 
      }); 
     }; 

     return factory; 
    }); 



app.controller('DefaultController', function ($scope, $location, AccountService){ 
    $scope.login = function(){ 
     AccountService.getAuthenticate($scope.credentials) 
      .success(function (response) { 
       alert('Everything went better than expected :)'); 
       $location.path('/dashboard'); 
      }) 
      .error(function (error) { 
       alert(error); 

      }); 
    }; 
}); 
+0

您的回調應從控制器中抽象出來並放入工廠。使用服務進行呼叫後,您應該只在控制器內進行數據綁定。 – tjacks3 2015-10-16 15:00:37