我的应用程序中有一个导航栏,用于控制整个应用程序的路径。因此,导航栏位于index.html文件中。
问题是加载页面时会加载导航栏NavController。在那个NavController中,我获得了用户的登录信息。用户信息用于确定显示哪些导航控件,因此showHomeNav,showAdminNav。问题是当NavController运行时用户通常没有登录,因此没有显示任何内容(这是正确的)。但是当用户登录时,我需要让Navbar html识别并显示正确的标签。
目前我不确定如何设置'show'变量。我需要做的是在LoginController中更改这些变量的状态,因为它是处理登录路由的控制器,登录后您将看到基于用户访问应该看到的选项卡。
我想我可以在NavBar HTML中检查$ rootScope变量($ rootScope.user),并在LoginController中设置$ rootScope.user。但我不确定这是否正确。
这是一个关于它如何立场的例子。请注意,在我登录(模拟)后,主页和管理员标签不会显示。
答案 0 :(得分:3)
两个想法:
首先,您可以创建自己的“Root”控制器。您只需要在登录控制器上方(层次结构)添加控制器。将它添加到<html>
标记或任何标记ng-app
都可能有意义。嵌套控制器没有任何问题。
但是,我认为您的案例中的正确答案是使用服务来管理登录信息。这使您可以通过黑客攻击在控制器之间干净地共享信息。
一个粗略的例子:
var app = angular.module("myApp", []);
app.factory("LoginService", ["$location", "$timeout", function($location, $timeout) {
var user = {};
return {
getUser: function() { return user; },
login: function(userName, password) {
$timeout(function() {
user.role = 'ADMIN';
$location.path("/about");
}, 1000);
}
};
}]);
app.controller("SigninCtrl", ["$scope", "LoginService", function($scope, LoginService) {
$scope.signin = function() {
LoginService.login("foo", "abc123");
}
}]);
app.controller('NavCtrl', ['$scope', '$location', 'LoginService', function ($scope, $location, LoginService) {
$scope.user = LoginService.getUser();
...
}]);
I've updated your Plunker code sample here。我还必须将Nav控制器上的showHomeNav
和showAdminNav
修改为函数,以便根据用户是否登录动态更改。
您可能希望稍微调整一下,但是您可以了解user
对象在服务中的位置。
答案 1 :(得分:0)
您可以尝试使用可以在控制器之间中继事件的$rootScope.$broadcast
方法。它也使控制器解耦。
Here是更新的插件。