我正在将我的控制器中的所有http调用移动到服务,使用$q
来承诺......一切似乎都有效,直到我刷新页面然后内容消失。
设置:在我的登录服务中,我有一个执行$http.post
的功能,需要username
和password
。然后将响应数据放入承诺中。
问题:虽然服务正常,但是在刷新页面时尝试重新发送http调用。然后呼叫失败,因为没有登录详细信息。
问题:如何保留/存储原始数据,以便在刷新页面时(并且用户仍在中登录)以及在其他地方使用该服务时控制器它没有做http调用它只返回数据?
服务
var app = angular.module('myApp', ['ngRoute']);
app.factory('loginService', function($http, $q) {
var deferResults = $q.defer();
return {
appContent: function(login_username, login_password) {
$http.post('/login',{username: login_username, password: login_password}).success(function(data) {
deferResults.resolve(myData);
});
return deferResults.promise;
}
});
控制器:
function loginPageCtrl($scope, loginService) {
$scope.login = function (login_username, login_password, login_rememberMe) {
loginService.appContent(login_username, login_username).then(function (data) {
$scope.pageOneContent = data;
});
};
};
function pageTwoCtrl($scope, loginService) {
// Use the same data when page is refreshed
// without having to pass-in login details
loginService.appContent().then(function (data) {
$scope.pageTwoContent = data;
});
};
答案 0 :(得分:2)
当然会发生这种情况,当您的网页刷新时,您的应用会失去所有状态。您需要在某个地方保留该用户名和密码,例如cookie,然后检索该用户名和密码然后进行第二次$http
调用,更好的方法是在cookie中保留一个令牌并将其用于身份验证。使用angular $cookieStore
来保留登录详细信息:
var userData={username:login_username,password:login_password};
$cookieStore.put('user_data', userData);
然后当控制器加载时,检查cookie是否存在:
var userData = $cookieStore.get('user_data');
return userData
检查this answer中的来源以查看此操作。
总结一下,每次控制器加载检查cookie时,如果未定义,则将用户重定向到登录页面,如果不是,则提取toke / username /密码并进行$http
调用。