问题描述
我正在使用Angular创建一个登录页面。
在后端处理完登录后,我从LoginCtrl设置MyService
的值,然后使用$window.location.href= 'main.jsp';
移至下一页$window.location.href= 'main.jsp';
。
但是,当我从HomeCtrl调用在LoginCtrl中设置的值时,这些值是否为空?
我知道服务是单例,并且将在整个应用程序中保持相同的状态。 但是在这种情况下,它会重置。 我认为这是因为使用$ window.location.href。 请帮助我解决我的问题。
这是我的服务(MyService):
app.service('MyService', function() {
var user = {
name: '',
permissions: ''
};
this.getUser = function() {
return user;
}
this.setUser = function(userr) {
this.user = userr;
}
});
这是我的LoginCtrl :(我刚刚发布了http.post部分)
$http({
method: 'POST',
url: 'login',
data: JSON.stringify($scope.user),
headers: {
'Content-Type': 'application/json'
}
}).success(function(data) {
if (!("failure" == data)) {
console.log(data);
var user = MyService.getUser();
user.name = data.name;
user.permissions = data.permissions;
console.log(user);
console.log(MyService.getUser());
$window.location.href = 'main.jsp';
// MyService.changeLocation('main.jsp', true);
} else {
$scope.information = "Invalid username/password!"
}
}).error(function(data) {
console.log(data);
});
这是我的HomeCtrl:
app.controller('HomeCtrl', function($scope, $http,MyService) {
console.log(MyService.getUser());
var user = MyService.getUser();
$scope.flashMessage="Hello " + user.name;
});
这里的user.name
为空。
1楼
您正在更改网页。
角度应用程序不会在网站范围内持续存在;
删除对window.location.href
的更改。
为了模拟Angular中的页面更改,请考虑使用官方路由器(Angular 1.4+附带),ngRoute或Angular UI Router。 这些解决方案使用“ HTML历史记录Api”和“后备广告”到hashbang URL来模拟您要实现的目标。
最终创建了一个单页应用程序,这是Angular设计的。
2楼
在LoginCtrl中,在到达success
回调时,您没有在MyService
服务中将响应值(本例中的data
)设置为user
对象。
您正在通过以下方式从“服务”获取user
对象
var user = MyService.getUser();
但是,将值设置为该对象将不会在服务中设置用户对象。
您需要使用MyService.getUser(user);
设置服务中的值, HomeCtrl
中将提供相同的HomeCtrl
$http({
method: 'POST',
url: 'login',
data: JSON.stringify($scope.user),
headers: {
'Content-Type': 'application/json'
}
}).success(function(data) {
if (!("failure" == data)) {
console.log(data);
var user= {};
user.name = data.name;
user.permissions = data.permissions;
MyService.getUser(user); //set the values for user
var obj= MyService.getUser(); //get the values for user
console.log(obj);
//should display user object
//with respective name and permissions should be available
console.log(MyService.getUser());
$window.location.href = 'main.jsp';
// MyService.changeLocation('main.jsp', true);
} else {
$scope.information = "Invalid username/password!"
}
}).error(function(data) {
console.log(data);
});
更新:
您的代码似乎不起作用的原因是:您错误地使用了$ window来更改路由。
$window.location.href = 'main.html'
正在某种程度上更改了angular上下文之外的路线 ,因此未运行HomeCtrl 。
要解决此问题,您需要执行以下操作:
首先,为您的角度应用程序定义路由(最好使用 )
app.config(function($stateProvider){ $stateProvider .state('login',{ url:'/', templateUrl:'login.html', controller:'LoginCtrl' }) .state('main',{ url:'/main', templateUrl:'main.html', controller:'HomeCtrl' }) .state("otherwise", { url : '/'}) })
使用
$location.url('/main')
。 注意,它与我们为state:main
定义的url模式相同。 或者更好的是,您应该使用$state.go('home');
将用户重定向到理想状态
这是一个工作的
希望这可以帮助!