2013-07-30 48 views
1

我有我的应用程序中的一个navbar控制整个应用程序的路线。因此,navbar位于index.html文件中。有没有这样的事情作为一个RootController

问题是导航栏NavController在加载页面时加载。在那个NavController中,我得到了用户的登录信息。用户信息用于确定显示哪些导航控件,因此showHomeNav,showAdminNav。问题是用户通常在NavController运行时没有登录,因此没有显示(这是正确的)。但是当用户登录时,我需要让Navbar html识别并显示正确的选项卡。

现在我不知道如何设置'show'变量。我需要做的是在LoginController中更改这些变量的状态,因为它是处理登录路由的控制器,登录后您将看到基于用户访问权限应该看到的选项卡。

我想我可以在NavBar HTML中检查$ rootScope变量($ rootScope.user),并在LoginController中设置$ rootScope.user。但我不确定这是否正确。

这是一个如何代表它的例子。请注意,登录后(模拟)家庭和管理员标签不显示。

http://plnkr.co/edit/zkqeAW?p=preview

回答

3

两个想法:

首先,你可以创建自己的 “根” 控制器。您只需要在登录控制器上方(分层)添加控制器。将它添加到<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控制器上的showHomeNavshowAdminNav修改为功能,以便根据用户是否登录进行动态更改。

你可能会想稍微调整一下,但你会明白user这个对象是如何存在于服务中的。

0

您可以尝试使用$rootScope.$broadcast方法,该方法可以通过控制器中继事件。它也使控制器解耦。

Here是更新后的plunkr。

相关问题