Ответ 1
Нет необходимости перезагружать контроллер. Angular достаточно умен, чтобы изменить шаблон при изменении состояния $scope.isAuthenticated
.
Одна проблема, которую я вижу в вашем коде, заключается в том, что после определения $scope.isAuthenticated
она больше не изменяется. Я полагаю, вы устанавливаете AuthenticationService.isAuthenticated = true
, когда пользователь входит в систему, но это изменение не распространяется на свойство $scope.isAuthenticated
, потому что в скалярных значениях JavaScript копируются по значению, а не по ссылке.
Существует много подходов, таких как изменение свойства AuthenticationService.isAuthenticated
от булева до функции:
angular.module('auth', [])
.factory('AuthenticationService', function () {
// private state
var isAuthenticated = false;
// getter and setter
var auth = function (state) {
if (typeof state !== 'undefined') { isAuthenticated = state; }
return isAuthenticated;
};
// expose getter-setter
return { isAuthenticated: auth };
});
Затем назначьте эту функцию в область $scope:
$scope.isAuthenticated = AuthenticationService.isAuthenticated;
Затем используйте функцию в своем шаблоне (не забывайте о парнах)
<app-header isauthenticated="{{ isAuthenticated() }}"></app-header>
Edit:
При написании plunk, чтобы показать вам рабочий пример, я понял, что ссылка на директиву не вызывается более одного раза, так как она отображается в fooobar.com/questions/413893/... Я только изменил директиву, чтобы наблюдать изменения в атрибуте isauthenticated
:
angular.module('directives', [])
.directive('appHeader', function() {
var bool = {
'true': true,
'false': false
};
return {
restrict: 'E',
link: function (scope, element, attrs) {
attrs.$observe('isauthenticated', function (newValue, oldValue) {
if (bool[newValue]) { scope.headerUrl = 'authenticated.html'; }
else { scope.headerUrl = 'not-authenticated.html'; }
});
},
template: '<div ng-include="headerUrl"></div>'
}
});