2014-12-17 2 views
0

У меня проблемы с угловыми контроллерами и услугами, и я не могу заставить их хорошо играть вместе.Угловой контроллер проверяет сервисное обещание обновить View

У меня есть API-интерфейс для входа в систему, и я хочу, чтобы контроллер знал, что произошел неудачный вход в систему и обновили представление соответственно.

Я попытался возвратить логическое из обещания логина Parse от службы, но контроллер не видит этого, и когда я устанавливаю переменную равную сервисной функции, я получаю «undefined».

var app = angular.module('myApp', []); 

app.controller('myController', ['scope', 'userService', function($scope, userService){ 

    $scope.ctrlFunc = function(){   
     var login = userService.login($scope.username, $scope.password); 
      //$scope.username & password are defined in other section 
     console.log(login); //returns 'undefined' 
     if(login == true){ 
      // go to other function 
     } 
     else{ 
      // do $scope changes to view 
     } 
    }; 
}]); 

app.service ('userService', function(){ 
    this.login = function(){ 
     Parse.User.logIn(username, password,{ 
      success: function (user){ 
       return true; 
      }, 
      error: function (error){ 
       return false; 
      } 
     }) 
    }; 
}); 

Мой контроллер был раздутым логикой, поэтому я попробовал разгрузить его на службу. Легче сказать, чем сделать для новичка угловой ...

ответ

1

Вы не учли асинхронный характер журнала в поведении. Вы либо должны использовать обратные вызовы, либо использовать Угловые обещания для обработки успеха или неудачи входа в систему.

С механизмом обещания услуги становится

app.service ('userService', function($q){ 
    var defer=$q.defer(); 
    this.login = function(){ 
     Parse.User.logIn(username, password,{ 
      success: function (user){ 
       defer.resolve(true); 
      }, 
      error: function (error){ 
       defer.reject(false); 
      } 
     }) 
     return defer.promise; 
    }; 
}); 

Теперь в контроллере вы можете сделать:

var login = userService.login($scope.username, $scope.password) 
      .then(function(result) { //result will be true and you can react to it.}, 
        function(error) { //error will be true and you can react to it.}) 

Читайте о Угловом обещает понять, как работают вещи.

+0

Спасибо! Все еще пытаясь обернуть голову обещаниями, не нажимал на меня, но этот код помогает понять все немного больше. – PizzaPleb

+0

Возможно, это может помочь вам немного http://andyshora.com/promises-angularjs-explained-as-cartoon.html – Chandermani

+0

Отлично подходит для моей ситуации, спасибо. – PizzaPleb

0

Ваш UserService shouuld вернуть обещание,

this.login = function(){ 
     return userService.logIn(username, password) 
}; 

, а затем в контроллере,

var login = Parse.User.login($scope.username, $scope.password).then(function(){ 
       $scope.isLoggedIn=true; 
     }).error(function(){ 
       $scope.isLoggedIn=false; 
      }) 

И в службе Parse.User это должен вернуть обещание,

Parse.User.login=function(username,pwd){ 
    return $http.post('/someUrl', {userName:username,password:pwd}) 
} 
Смежные вопросы