AngularJS $location не обновляется должным образом при использовании $routeProvider

StackOverflow https://stackoverflow.com//questions/23000180

Вопрос

У меня есть приложение 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 */ } );

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top