Обработка верхних и нижних колонтитулов в AngularJS
Я пытаюсь реализовать верхний/нижний колонтитул в приложении Angular JS. Я думал добавить их как ng-include в основной index.html. Однако это сработало бы, если верхний и нижний колонтитулы являются статическими страницами. Мой случай немного отличается... На странице входа нет заголовка/нижнего колонтитула. Другие страницы в зависимости от того, вошли ли вы в систему или нет, вы должны показать "Приветственный пользователь [logout]" или "Welcome guest [login]".
Я сохраняю данные для входа и isLoggedIn в службе, а затем используйте контроллер HeaderCtrl для копирования в $scope. Самая большая проблема заключается в том, что весь ng-include не обновляется при выходе из системы. Следовательно, divs с ng-show hide директивы не будут скрывать/показывать при изменении. Кто-то предложил использовать ng-switch - он также ведет себя одинаково.
Если я перемещаю код заголовка внутри отдельных представлений, все в порядке.
Аналогичный вопрос здесь: Обновить заголовок страницы в angularjs
AngularJS - обрабатывать повторяющиеся фрагменты, такие как верхний и нижний колонтитулы
Я задал этот вопрос раньше, но ответы не помогли мне, когда я переместил зарегистрированную переменную из rootScope. Проблема в том, что мой HeaderCtrl работает только при полном обновлении страницы. Не выполняется на странице Angular навигации по страницам и т.д.
Вот код:
index.html:
<body ng-app="greenhornApp">
<div id="navbar" ng-controller="HeaderCtrl"><div ng-include src="'views/partials/header.html'"></div>
</div>
<div class="title-spacer visible-desktop"></div>
<!-- Add your site or application content here -->
<div class="wrapper" ng-view></div>
</body>
header.js:
angular.module('greenhornApp')
.controller('HeaderCtrl', ['$scope', 'LoginService', function ($scope, loginService) {
$scope.isLoggedIn = loginService.isLoggedIn();
$scope.session = loginService.getSession();
}]);
header.html
<div>
<div ng-show="isLoggedIn">
<div class="navbar navbar-inverse navbar-fixed-top">
More stuff here....
</div>
</div>
</div>
Я использую ng-route и Angular 1.2.0-rc3. Я поставил точку останова в HeaderCtrl... он запускается только тогда, когда я полностью обновляю страницу. Что я здесь делаю неправильно?
Ответы
Ответ 1
Если ваш loginService.isLoggedIn()
привязан к примитивному значению вместо объекта, ваш HeaderCtrl
должен использовать $watch
для наблюдения за переменной и получения нового значения по мере ее изменения.
Чтобы он работал без $watch
, вам необходимо убедиться, что ссылка на объект передается с вашего loginService
на ваш HeaderCtrl
.
Я сделал два быстрых Plunkers, которые, как мы надеемся, достаточно хорошо отражают вашу ситуацию, чтобы дать некоторые рекомендации:
С примитивным и $watch
: http://plnkr.co/edit/LvtVEE?p=preview
С ссылкой на объект и $watch
: http://plnkr.co/edit/2u2ZDE?p=preview
Ответ 2
EDIT: Мои оригинальные рассуждения были неправильными. Ответьте tasseKATT на это.
Вот еще один способ связи между контроллерами, использующими механизм раскрутки angularJS
Здесь jsfiddle, чтобы показать основную идею.
var module = angular.module("demo", []);
function Header ($scope){
$scope.userIsLoggedIn = true
$scope.$on('DO_LOGOUT',function(event){
alert('Header is updating log-status')
$scope.userIsLoggedIn=false
})
}
function Dynamic($scope){
$scope.logout =function(){
$scope.$emit('LOGOUT_REQUESTED')
}
}
function Root($scope) {
$scope.$on('LOGOUT_REQUESTED',function(event){
alert('Rootscope got logout event')
$scope.$broadcast('DO_LOGOUT')
})
}