我在角度控制器和服务方面遇到了麻烦,我不能让它们在一起玩得很好。
我有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;
}
})
};
});
我的控制器因逻辑而膨胀,所以我尝试将其卸载到服务中。对于有角度的初学者说起来容易做起来难......
答案 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})
}