AngularJS $location не обновляется должным образом при использовании $routeProvider
-
20-12-2019 - |
Вопрос
У меня есть приложение Angular JS с defaultController
который управляет заголовком приложения.Затем у меня есть несколько других контроллеров, по одному для каждого представления.Представления загружаются в <main>
.Я загружаю представления, используя $routeProvider
с помощью этого кода:
myapp.config(['$routeProvider',
function($routeProvider) {
$routeProvider.
when('/login', {
templateUrl: 'templates/login.html',
controller: 'loginController'
}).
when('/dashboard', {
templateUrl: 'templates/dashboard.html',
controller: 'dashboardController'
}).
...
Я пытаюсь отобразить кнопку ВЫХОДА из системы внутри заголовка, когда загруженным представлением является панель мониторинга, и скрыть ее, если загруженным представлением является представление входа в систему.Для того, чтобы сделать это, у меня есть на defaultController
тот самый $location
объект, и я правильно добавляю и удаляю классы с помощью кнопки ВЫХОДА из системы с помощью ng-class
.
Есть только одна проблема:$location указывает мне правильный путь при первой загрузке страницы, но после того, как я изменю вид (измененный $routeProvider
) эта переменная больше не обновляется, поэтому, когда я на самом деле включаю /#/dashboard
, тот самый $location.url
все еще включен /login
.Вот код контроллера:
controllers.controller('defaultController', ['$scope', 'ipCookie', '$location', function($scope, ipCookie, $location) {
$scope.url = $location.url();
...
Я также пробовал с $window.location.hash
с тем же результатом.
Есть какие-нибудь идеи?
Редактировать:после принятого ответа это то, что я добавил в defaultController
для того, чтобы заставить это работать
$scope.$on("$locationChangeSuccess", function() {
$scope.url = $location.url();
});
Решение
Местоположение, вероятно, обновляется в сервисе после загрузки вашего контроллера по умолчанию.
Вы можете либо ввести $location
просматривайте область действия и принимайте решения в своем шаблоне на основе этого (затем он будет автоматически просмотрен и переоценен), или вы могли бы прослушать $locationChangeSuccess
событие.
При инъекции вы можете просто $scope.location = $location
а затем используйте что-то вроде <a ng-hide="location.path() != '/something'">
.
$location
транслирует $locationChangeSuccess
в корневой области, так что вы должны иметь возможность прослушивать его в любой доступной вам области: $scope.$on( "$locationChangeSuccess", function() { /* do something */ } );