我创建了web应用程序,登录到欢迎页面后有一个重定向,但在这种情况下标题不会更新。 这是我的Angular代码:
MyApp.controller('LoginController', function ($scope) {
$scope.login = function () {
login();
var name = "";
if (document.cookie.indexOf("name") !== -1)
name = document.cookie.split('=')[2];
$scope.menu = [
{
title: 'Product',
url: 'product'
},
{
title: 'About',
url: 'about'
},
{
title: 'Contact',
url: 'contact'
},
{
title: name,
url: 'welcomeUser'
},
{
title: 'LogOut',
url: 'logout'
}
];
$scope.refresh();
};
});
MyApp.controller('MainController', function ($scope) {
var name = "";
if (document.cookie.indexOf("name") !== -1)
name = document.cookie.split('=')[2];
if (document.cookie.indexOf("name") === -1 && (name === "" || name === undefined)) {
$scope.menu = [
{
title: 'Product',
url: 'product'
},
{
title: 'About',
url: 'about'
},
{
title: 'Contact',
url: 'contact'
},
{
title: 'Register',
url: 'register'
},
{
title: 'Login',
url: 'login'
}
];
} else {
$scope.menu = [
{
title: 'Product',
url: 'product'
},
{
title: 'About',
url: 'about'
},
{
title: 'Contact',
url: 'contact'
},
{
title: name,
url: 'welcomeUser'
},
{
title: 'LogOut',
url: 'logout'
}
];
}
});
Angular配置代码:
MyApp.config(function ($routeProvider, $locationProvider) {
$routeProvider
.when('/home', {
templateUrl: 'partials/home.html',
controller: 'MainController'
})
.when('/login', {
templateUrl: 'partials/login.html',
controller: 'LoginController'
})
.otherwise({
redirectTo: '/404'
});
});
这是我的POST请求发送的JS代码 - 登录用户功能:
function login() {
var username = document.getElementById('usernameLogin').value;
var password = document.getElementById('passwordLogin').value;
if (!username.trim() || username.length === 0 || !password.trim() || password.length === 0) {
document.getElementById('wrong_username').style.display = 'block';
document.getElementById('wrong_password').style.display = 'block';
return;
}
var json = {
username: username,
password: sha1(password)
};
$.ajax({
type: "POST",
url: "http://localhosts:7777/account_management/login_user",
data: JSON.stringify(json),
contentType: "application/json; charset=utf-8",
success: function (data) {
if (data === "true") {
document.cookie = "";
document.cookie = "username=" + username;
window.location.href = "/#/welcomeUser";
} else if (data === "false") {
document.getElementById("wrong_password").style.display = "block";
} else {
alert(data);
};
},
failure: function (errMsg) {
alert(errMsg);
}
});
}
授权本身工作正常,但$scope.menu
仅在页面刷新后更新。
有任何想法如何修复它?
答案 0 :(得分:15)
MainController
ad LoginController
是两个不同的控制器,并且具有不同的范围。
在一个中更改$scope.menu
并不会在另一个中发生变化,因为他们没有任何父子关系。
您必须拥有$rootScope
中的菜单,然后在登录后在相应的控制器中更新它。
MyApp.controller('LoginController', function ($scope, $rootScope) {
$rootScope.menu = [];
});
MyApp.controller('MainController', function ($scope, $rootScope) {
$rootScope.menu = []; // update the menu
});
否则,将它作为一项服务,以便您可以使用$emit
事件,并在用户登录后更新菜单。
function login() {...}
必须是服务的一部分。您必须避免在角度项目中使用jQuery
。使用$http
内部服务,这是首选,并提供与$.ajax
答案 1 :(得分:8)
您可以使用事件来警告用户已登录的菜单以及他应该自行重新加载,而不是将您的菜单放在$rootScope
中。
在LoginController上
$rootScope.$broadcast('userLoggedIn');
在MainController上
$rootScope.$on('userLoggedIn', function () {
//Code to apply modification to your menu
});
如果必须传递参数,可以使用$broadcast
方法的第二个参数,如下所示:
$rootScope.$broadcast('userLoggedIn', {key: 'value'});
$rootScope.$on('userLoggedIn', function (params) {
console.log(params.key); //value
});
答案 2 :(得分:3)
您需要将$rooteScope
用于来自其他控制器的调用范围变量。
请在登录控制器中使用$rooteScope.objectName
,而不是使用$scope.objectName
。
喜欢
//在主控制器中分配范围变量的菜单详细信息
MyApp.controller('MainController', function ($scope) {
$scope.menu = [
{
title: 'Product',
url: 'product'
},
{
title: 'About',
url: 'about'
},
{
title: 'Contact',
url: 'contact'
},
{
title: 'Register',
url: 'register'
},
{
title: 'Login',
url: 'login'
}
];
});
// 然后通过rootScope从登录控制器
调用范围变量MyApp.controller('LoginController', function ($scope,$rootScope ) {
$rootScope.menu = [
{
title: 'Product',
url: 'product'
},
{
title: 'About',
url: 'about'
},
{
title: 'Contact',
url: 'contact'
},
{
title: 'Register',
url: 'register'
},
{
title: 'Login',
url: 'login'
}
];
});
您的window.location.href = "/#/welcomeUser";
是一个javascript代码,因此不考虑范围对象
您需要更改window.location.href = "/#/welcomeUser";
到$location.path('/#/welcomeUser');
您还需要在控制器上配置$location
如果以上两个解决方案无效,您需要使用$route.reload()
但第三种解决方案并不好,因为它会使页面重新加载。但它解决了您手动重新加载屏幕的问题。