是否有RootController这样的东西

时间:2013-07-30 02:47:05

标签: angularjs

我的应用程序中有一个导航栏,用于控制整个应用程序的路径。因此,导航栏位于index.html文件中。

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

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

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

这是一个关于它如何立场的例子。请注意,在我登录(模拟)后,主页和管理员标签不会显示。

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

2 个答案:

答案 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控制器上的showHomeNavshowAdminNav修改为函数,以便根据用户是否登录动态更改。

您可能希望稍微调整一下,但是您可以了解user对象在服务中的位置。

答案 1 :(得分:0)

您可以尝试使用可以在控制器之间中继事件的$rootScope.$broadcast方法。它也使控制器解耦。

Here是更新的插件。