【问题标题】:Is there such thing as a RootController有没有像 RootController 这样的东西
【发布时间】:2013-07-30 00:54:03
【问题描述】:

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

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

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

我想我可以只检查 NavBar HTML 中的 $rootScope 变量 ($rootScope.user),然后在 LoginController 中设置 $rootScope.user。但我不确定这是不是正确的做法。

这里有一个例子来说明它的立场。请注意,在我登录(模拟)后,主页和管理选项卡不会显示。

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

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    两个想法:

    首先,您可以创建自己的“根”控制器。您只需要在登录控制器上方(分层地)添加一个控制器。将它添加到<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。我还必须将导航控制器上的showHomeNav 和showAdminNav 修改为函数,因此它们会根据用户是否登录而动态更改。

    您可能需要稍微调整一下,但您会了解user 对象在服务中的存在方式。

    【讨论】:

      【解决方案2】:

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

      Here 是为此更新的 plunkr。

      【讨论】:

        猜你喜欢
        • 2014-09-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多