2014-11-21 2 views
0

Я разрабатываю backoffice, с угловым, HTML & jQuery, чтобы иметь одностраничное приложение. Я использую аутентификацию пользователя. Я создал файл cookie для «сеанса пользователя», и я могу его уничтожить при выходе пользователя из системы. Но я работаю с Bootstrap, и у меня есть раскрывающееся меню с именем пользователя и меню слева, и я хочу скрыть их, когда пользователь отключен.Как обновить угловые контроллеры при перенаправлении маршрута

У меня есть один контроллер для каждого меню, и если я его выполню, он скроет то, что я хочу.

Пример:

.controller('SessionController', ['$scope', '$http', '$location', '$cookies', function ($scope, $http, $location, $cookies) { 
      if (typeof $cookies.userSession === "undefined") { 
       $(".nav.navbar-nav.navbar-right").hide(); 
       $location.path("/"); 
      } else { 
       $("#userLogin").text($cookies.userSession); 
       $(".nav.navbar-nav.navbar-right").show(); 
       $location.path("/customers"); 
      } 
     }]) 

Я что-то около $ scope.digest() и $ scope.apply() читать, но я не могу это сделать. Может быть, с директивой?

ответ

0

Я делаю что-то очень похожее с моим последним приложением, но вы не обновляете контроллер. Это больше мышления в стиле jQuery. Вы хотите использовать нг-шоу/нг скрытие, и установить правильный ВАР в контроллере:

<div ng-show="user.loggedIn"><a href="/logout" ng-click="logout()">Logout</a></div> 
<div ng-show="!user.loggedIn"><a href="/login">Login</a></div> 

(Вы можете так же легко поместить выпадающее меню внутри выше DIV)

Тогда ваш контроллер должен иметь

.controller('SessionController', function ($scope,AuthSvc) { 
     $scope.user = AuthSvc.user; 
     $scope.logout = function() {AuthSvc.logout();}; 
    }); 

Когда пользователь выходит из системы, просто установите AuthSvc.user.loggedIn в false, и он будет наследоваться по всем направлениям. Это красота двухсторонних привязок.

.factory('AuthSvc',function() { 
    return { 
    user: {loggedIn:false}, 
    logout : function() { 
     // do whatever other logout stuff you need, like deleting sessions 
     this.user.loggedIn = false; 
    }, 
    login : function() { 
     // do whatever other login stuff you need, like validating with the server 
     this.user.loggedIn = true; 
    } 
    }; 
}); 
+0

Я не понимаю, что такое «AuthSvc»?Как он может обнаружить действие выхода из системы? – Azuken

+0

'AuthSvc' - это создаваемая вами служба, которая содержит текущий статус пользователя. Вы вызываете его, когда хотите проверить статус пользователя с контроллера (или другой службы) или изменить его (например, выход из системы). Я отредактирую ответ, чтобы показать немного больше. – deitch

+0

Наконец, он отлично работает для выпадающего меню (спасибо!), Но для левой стороны nav, так как он находится в другом контроллере ... Я попытался сделать это с условием 'if (AuthSvc.user.loggedIn) {} ', но он работает только с перезагрузкой страницы ... – Azuken

0

Я уверен, что существует много способов добиться того, что вы действительно пытаетесь сделать (что показывает/скрывает материал, а не реконструирует контроллер). Простейшим, вероятно, является создание свойства isLoggedIn по объему и использование директивы ng-show/ng-hide. Или вы можете отделить вход в свой собственный шаблон и использовать ng-include, чтобы показать форму входа или реальный контент.


Чтобы адресовать вашу заботу о печенье и перезагрузке: Вы просто не думать в Angular :) Установка печенья может быть полезны на несколько страниц или через перезагрузку страницы. Однако, если вы хотите использовать функцию Angular для автоматического обновления отображаемого контента на основе базовых данных (без перезагрузки страницы), вам необходимо изменить базовые данные. Я имею в виду, что вам нужно создать свойство на $scope, например isLoggedIn, и обновить его, когда вы настраиваете файл cookie.

+0

Я понял, что вы имеете в виду, и я поместил логическое значение с директивой ng-show, но у меня нет страницы перезагрузки, поэтому директива, похоже, не выполняется, и мое меню не исчезает .. – Azuken

+0

I ' я не совсем уверен, что вы подразумеваете под этим, и вы не предоставили достаточно кода в своем вопросе для меня, чтобы понять это. Директива 'ng-show' просто работает, поэтому у вас должно быть что-то еще неправильное. Я поставлю код в свой ответ, чтобы показать вам, что я имею в виду. ... Ах, может быть, я понял, что вы имеете в виду. Я отвечу в ответ. – hon2a

1

если вы используете UI-маршрутизатор, вы можете легко заставить перегрузите:

.controller('SessionController', ['$scope', '$http', '$location', '$cookies','$state', function ($scope, $http, $location, $cookies,$state) { 
      if (typeof $cookies.userSession === "undefined") { 
       $(".nav.navbar-nav.navbar-right").hide(); 
       $state.go('home',{},{reload:'true'}); 
      } else { 
       $("#userLogin").text($cookies.userSession); 
       $(".nav.navbar-nav.navbar-right").show(); 
       $state.go('customers',{},{reload:'true'}); 
      } 
     }]) 

Пожалуйста, обратите внимание, что этот фрагмент кода с использованием состояния home и customers, которые должны быть определены Somwhere еще.

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