$location.path() обновляется после второго клика?

[И второй вопрос (см. Ниже) - переменная rootScope, установленная в одном контроллере, не видна во втором, дочернем контроллере?]

Возможный дубликат: angularjs $ location.path обновляет только URL-адрес при втором щелчке - причина проблемы и ответ не кажутся уместными в моей, более простой, ситуации

Согласно документам angularjs ( https://docs.angularjs.org/guide/$ location):

[The $location service]
Maintains synchronization between itself and the browser's URL when the user
...
Clicks on a link in the page.

Я понял, что $location.path() отражает текущий URL в браузере, но когда я щелкаю ссылку, чтобы изменить представление, он демонстрирует странное поведение: $location.path() не "изменяется" при первом нажатии на ссылку, и каждый раз после этого она будет меняться на ссылку, которая была нажата в предыдущий раз

Чтобы увидеть это, перейдите сюда: http://jsfiddle.net/7Ah2W/

Я попытался обойти эту проблему, чтобы вручную установить $location.path(), используя перегрузку сеттера.

При этом я обнаружил еще один недостаток в моем понимании angularjs. Я попытался установить переменную в rootScope для отображения "текущего пути". Идея заключается в том, что представления будут автоматически обнаруживать изменения в переменной и обновлять. Разве все области не наследуются от rootScope?

Вот jsfiddle

Почему я ожидаю, что $ rootScope.currentPath, измененный в 'NavCtrl' и обновленный в 'CtrlTwo', не будет достигнут?

Моя конечная цель - сделать так, чтобы моя панель навигации автоматически менялась при нажатии на ссылку в представлении. Аналогично https://console.developers.google.com/ где, если вы щелкнете по своему проекту, навигация влево изменится на API&Auth, настройки и т. Д.

1 ответ

Решение

Причина, по которой он, кажется, всегда "один позади", заключается в том, что вы получаете доступ к $location.path() прежде чем фактический угловой процесс страницы может быть запущен. Как ни странно, если вы просто добавите $timeout с задержкой даже 0 мс, она будет работать как задумано.

    $timeout(function () {
        $scope.currentPath = $location.path();
    }, 0);

Пример jsFiddle

$ rootScope - это глобальная область видимости, в отличие от обычной области видимости, которая в основном является связующим звеном между контроллером и представлением.

Например я установил $rootScope.test = 123; в вашем первом контроллере, а во втором контроллере я оповещаю эту переменную и получаю результат. Пример jsFiddle $ rootScope. Будьте осторожны с $ rootScope, он создает глобальные переменные

Другие вопросы по тегам