2013-07-30 3 views
1

У меня есть приложение navbar в приложении, которое управляет маршрутами для всего приложения. Таким образом, navbar находится в файле index.html.Есть ли такая вещь, как RootController

Проблема заключается в том, что навигатор NavController загружается при загрузке страницы. В этом NavController я получаю информацию для входа для пользователя. Пользовательская информация используется для определения того, какие элементы управления навигацией показаны, следовательно, showHomeNav, showAdminNav. Проблема заключается в том, что пользователь обычно не регистрируется при запуске NavController, поэтому ничего не отображается (это правильно). Но когда пользователь входит в систему, мне нужно, чтобы httml Navbar распознал это и отобразил правильные вкладки.

Как бы то ни было, я не знаю, как установить переменные 'show'. Мне нужно изменить состояние этих переменных в LoginController, так как это контроллер, который обрабатывает логин, и после входа в систему вы увидите вкладки, которые вы должны увидеть, в зависимости от доступа пользователя.

Я думаю, что я мог бы просто проверить переменную $ rootScope ($ rootScope.user) в HTML-блоке NavBar и установить $ rootScope.user в LoginController. Но я не уверен, что это правильный способ сделать это.

Здесь находится плунжер на примере того, как он стоит. Обратите внимание, что после входа в систему (имитация) вкладки дома и администратора не отображаются.

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

ответ

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. Я также должен был изменить функции showHomeNav и showAdminNav на контроллере Nav, чтобы они динамически изменялись в зависимости от того, вошел ли пользователь в систему или нет.

Возможно, вам захочется немного подкорректировать это, но вы получите представление о том, как объект живет в службе.

0

Вы можете попробовать использовать метод $rootScope.$broadcast, который может передавать события через контроллер. Он также поддерживает развязку контроллера.

Here - это обновленный планшет для этого.

Смежные вопросы