2014-09-06 8 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 вызовов. Любая идея, что мне не хватает?

+3

вашей функция оленьей кожи ничего возвращать на один, второй вы делаете asyc звонков так что ваша функция будет возвращать, прежде чем запрос Аякса является done –

+0

Возможный дубликат [Как вернуть ответ от вызова Ajax?] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) –

+0

As Патрик говорит, что функция async не вернет такое значение, либо вернет обещание, либо воспользуется обратным вызовом. –

ответ

-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

Смежные вопросы