$ location.path() vs $location.hash() в angularjs
если мой текущий URL-адрес: xzy.com/#/home/new
$location.hash()
дает home/new
и $location.path
также дает home/new
- В чем разница между двумя?
- Если внутри контроллера дома/нового я пишу
$location.hash("#/home/new")
или $location.path("/home/new")
, оба не перезагружают частичный, но если я делаю location.href="#/home/new"
, он перезагружает частичное. Почему это?
Кроме того, если внутри частичного есть <a href="#/home/new">
, который также перезагрузит частичный.
Почему не задан путь/хеш для перезагрузки частичного?
Ответы
Ответ 1
Есть две части маршрута.
Первый "хэш" действительно существует только для совместимости браузера и не будет отображаться, если вы находитесь в режиме HTML5.
Например, с учетом этого URL-адреса:
http://localhost/spa.htm
Если вы установили:
$location.path('/myPath');
вы получите:
http://localhost/spa.htm#/myPath
В этом случае "хэш" предназначен только для браузера, чтобы удерживать URL-адрес, метод - это путь. Обратите внимание также, когда вы вызываете путь без предшествующего/он добавляется, т.е. 'myPath'
становится '/myPath'
.
Если вы впоследствии установите:
$location.hash('myHash');
Вы получите:
http://localhost/spa.htm#/myPath#myHash
Наконец, предположим, что вы не установили путь первым, тогда вы получите:
http://locahost/spa.htm#/#myHash
Если вы используете режим HTML5, путь добавляется без начального хэша.
Первый хеш используется для добавления маршрута, второй - ссылкой на контент на странице. Например, если вы используете службу $anchorScroll
, она ответит на то, что помещается в $location.hash()
, а не в $location.path()
.
Подводя итог:
http://localhost/spa.htm#{path}#{hash}
Ответ 2
У меня был аналогичный вопрос сегодня утром, после чего Google привел меня сюда.
Вдохновленный другими ответами и некоторыми Googlings, которые я сделал, вот мой результат:
например, с учетом URL-адреса браузера:
http://localhost:8080/test.html#!/testpath#testhash%20with%20someothers
в AngularJS,
-
url
/testpath # testhash
-
path
-
/testpath
в другом слове слева направо, path
начинается с первого символа в URL-адресе и заканчивается на #
или ?
или в конце URL-адреса.
path
всегда начинаться с '/'.so, если не указано path
, путь устанавливается как "/
", а не "
"
-
hash
testhash %20with %20someothers
в другом слове hash
начинается со следующего символа #
в url
и заканчивается в конце url
location.href
не реализуется в AngularJS. когда вы говорите: location.href="#"
, он ведет себя как щелчок тега anchor
:
<a href="#">click</a>
при вызове метода $location.path
, $location.hash
в качестве сеттеров они меняют URL-адрес браузера в соответствии с вашими требованиями.
И почему вы хотите, чтобы AngularJS на странице RELOAD на странице?:)
Ответ 3
Причина второй части вашего вопроса, почему она не перенаправляется, может быть:
Возможно, вам потребуется обновить привязку с помощью $scope. $apply, это необходимо, если вы используете код, отличный от angular, например, собственный javascript, код jquery
например:
$scope.$apply(function(){
$location.path("#/home/new");
})