Javascript $http PROMITE不更新作用域(ng hide)
我在这里试图实现的是向我的api发送一个get请求,该api根据用户是否登录做出正确/错误的响应。理想情况下,如果用户已登录,我希望隐藏登录表单。我正在使用angular的内置http方法,该方法返回一个承诺,据我所知,它已经封装在$apply中,因此我原以为作用域会自动更新 我的控制器:Javascript $http PROMITE不更新作用域(ng hide),javascript,angularjs,Javascript,Angularjs,我在这里试图实现的是向我的api发送一个get请求,该api根据用户是否登录做出正确/错误的响应。理想情况下,如果用户已登录,我希望隐藏登录表单。我正在使用angular的内置http方法,该方法返回一个承诺,据我所知,它已经封装在$apply中,因此我原以为作用域会自动更新 我的控制器: .controller('MyCtrl1', ['$scope', 'isLoggedIn', '$timeout', function($scope, isLoggedIn, $timeout) {
.controller('MyCtrl1', ['$scope', 'isLoggedIn', '$timeout', function($scope, isLoggedIn, $timeout) {
isLoggedIn.getState().then(function(result) {
$scope.displayLogin = result.data.state;
});
$scope.getLoginState = function() {
console.log($scope.displayLogin);
}
}]);
我的服务:
.factory('isLoggedIn', function($http, $q) {
return {
getState: function(scope) {
return $http.get('/login-state').then(function(result) {
return result
});
}
}
})
html:
我知道值本身正在更新,因为我有一个带有ng click的按钮绑定到getLoginState方法,该方法返回具有正确值的displayLogin,似乎ng hide没有反映这一点?好像范围没有意识到更改
我如何才能让它工作,使我的真实值隐藏表单?根据您的代码,您似乎指定您的工厂返回
$http
服务的承诺
.factory('isLoggedIn', function($http, $q) {
return {
getState: function(scope) {
return $http.get('/login-state');
}
}
});
我会试着做一个扑通来检查这个,但是如果你
isLoggedIn.getState().then(function(result) {
$scope.displayLogin = result.data.state;
});
试着写
$scope.displayLogin = isLoggedIn.getState()
并修改工厂以返回$http.get的结果,而不是$http.get本身
更新:以下是使用promise($q服务)的工厂版本:
然后您可以这样使用它:
isLoggedIn.getState(function(returnData) {
$scope.displayLogin = returnData;
});
我必须使用回调来让它正确更新。当您获得数据时,您的promise对象应该更新。这里有一个指向plunker的链接:我看不到更多的代码。不知道
表单
是否在范围
上,或者不在显示登录
属性上。[Offtopic]isLoggedIn服务中的then回调不会返回任何位置,因此可以删除它以节省cpu时间。尽管OP的代码可以简化为这一点,我认为这对他所描述的问题没有任何影响Antonio是对的,但是我确实修改了我的代码,出于某种原因,我看到了很多示例,其中服务是如何构建的,但不知道为什么-我对angular是新手,所以我只是模仿它(但它没有真正的效果)
.factory('isLoggedIn', function($http, $q) {
return {
getState: function(cb) {
var deferred = $q.defer();
$http.get("/login-state").success(function(data){
deferred.resolve(data);
});
deferred.promise.then(function (result) {
return cb(result);
});
}
}
});
isLoggedIn.getState(function(returnData) {
$scope.displayLogin = returnData;
});