Angular Controller检查服务承诺以更新视图

时间:2014-12-17 04:54:49

标签: javascript angularjs parsing undefined promise

我在角度控制器和服务方面遇到了麻烦,我不能让它们在一起玩得很好。

我有Parse API登录,我希望控制器知道发生了取消/成功登录并相应地更新了视图。

我尝试从服务中的Parse登录承诺返回一个布尔值,但是控制器看不到这个,当我设置一个等于服务函数的变量时,我得到'未定义'。

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;
            }
        })
    };
});

我的控制器因逻辑而膨胀,所以我尝试将其卸载到服务中。对于有角度的初学者说起来容易做起来难......

2 个答案:

答案 0 :(得分:1)

您尚未考虑登录行为的异步性质。您需要使用回调或使用Angular承诺来处理登录成功或失败。

使用承诺机制,服务变为

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.})

了解Angular承诺,了解事情是如何运作的。

答案 1 :(得分: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服务中,它应该返回一个promise,

Parse.User.login=function(username,pwd){
  return  $http.post('/someUrl', {userName:username,password:pwd})
}