角度控制器检查服务承诺更新视图

Angular Controller Checks Service Promise to Update View

本文关键字:更新 新视图 服务承诺 检查 控制器      更新时间:2023-09-26

我在使用角度控制器和服务时遇到问题,无法让它们很好地协同工作。

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

我的控制器逻辑臃肿,所以我尝试将其卸载到服务中。对于一个有棱角的初学者来说,说起来容易做起来难......

您尚未考虑登录行为的异步性质。您要么需要使用回调,要么使用 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 承诺的信息,了解事物的运作方式。

你的用户服务返回一个承诺,

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