$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);
$ rootScope - это глобальная область видимости, в отличие от обычной области видимости, которая в основном является связующим звеном между контроллером и представлением.
Например я установил $rootScope.test = 123;
в вашем первом контроллере, а во втором контроллере я оповещаю эту переменную и получаю результат. Пример jsFiddle $ rootScope. Будьте осторожны с $ rootScope, он создает глобальные переменные