Ответ 1
вы должны использовать $route.reload(), чтобы принудительно перезагрузить.
Я не знаю, есть ли "автоматический" способ сделать это, но вы можете использовать ng-click по этим ссылкам
Я использую routeProvider для определения контроллеров и шаблонов для моих URL-адресов.
Когда я нажимаю на ссылку, которая имеет тот же URL-адрес, что и фактическое местоположение, ничего не происходит. Мне бы хотелось, чтобы метод reload()
вызывался, если пользователь нажимает на такую ссылку, даже если местоположение не изменилось. Другими словами, если я установил местоположение в одно и то же значение, я бы хотел, чтобы он вел себя так же, как если бы я установил его в другое значение.
Есть ли способ настроить routeProvider или locationProvider, чтобы сделать это автоматически? Или что такое правильный подход? Это поведение stadard в приложениях с круговым движением, но как это сделать в angularjs?
Я также спросил его группы google.
UPDATE:
Этот вопрос получает много просмотров, поэтому я попытаюсь объяснить, как я решил свою проблему.
Я создал настраиваемую директиву для ссылки в моем приложении, как предложил Ренан Томаль Фернандес в комментариях.
angular.module('core.directives').directive('diHref', ['$location', '$route',
function($location, $route) {
return function(scope, element, attrs) {
scope.$watch('diHref', function() {
if(attrs.diHref) {
element.attr('href', attrs.diHref);
element.bind('click', function(event) {
scope.$apply(function(){
if($location.path() == attrs.diHref) $route.reload();
});
});
}
});
}
}]);
Затем директива используется для всех ссылок в моем приложении. Я хочу иметь эту функциональность.
<a di-href="/home/">Home</a>
Что делает эта директива, так это то, что он устанавливает атрибут href
для вас на основе атрибута di-href
, поэтому angular может обрабатывать его, как всегда, и вы можете видеть URL-адрес, когда вы наводите курсор на ссылку. Кроме того, когда пользователь нажимает на него, и путь ссылки совпадает с текущим путем, он перезагружает маршрут.
вы должны использовать $route.reload(), чтобы принудительно перезагрузить.
Я не знаю, есть ли "автоматический" способ сделать это, но вы можете использовать ng-click по этим ссылкам
Добавить/(косой чертой) в определенный URL-адрес в конфигурации маршрута
Сегодня я столкнулся с подобной проблемой, у меня есть ссылка на моей веб-странице, и когда я нажимаю на нее, я хочу перезагружать ng-view каждый раз, чтобы я мог обновлять данные с сервера. Но если местоположение URL-адреса не изменяется, angular не перезагружает ng-view.
Наконец, я нашел решение этой проблемы. На моей веб-странице я установил ссылку href на:
<a href="#/test">test</a>
Но в конфигурации маршрута я устанавливаю:
$routeProvider.when('/test/', {
controller: MyController,
templateUrl:'/static/test.html'
});
Разный - последний слэш в URL-адресе. Когда я впервые нажимаю href="#/test"
, angular перенаправляет URL-адрес на #/test/
и загружает ng-view. когда я нажимаю его второй раз, потому что текущий url #/test/
, он не равен url в ссылке (href="#/test"
), на который я нажал, поэтому angular запускает метод изменения местоположения и перезагружает ng-view, в дополнение angular снова перенаправляет URL-адрес на #/test/
. в следующий раз, когда я нажму URL, angular сделает то же самое снова. Это именно то, что я хотел.
Надеюсь, это было полезно для вас.
Вы можете добавить _target='_self'
в ссылку, чтобы перезагрузить страницу.
например.
<a href="/Customer/Edit/{{customer.id}}" target="_self">{{customer.Name}}</a>
Я тестировал это на версиях 1.0.5 и 1.2.15 на IE и Firefox. Кажется хорошо работать.
Здесь больше информации от сайта AngularJS:
Переписывание HTML-ссылок
Когда вы используете режим API истории HTML5, вам понадобятся разные ссылки в разных браузерах, но все, что вам нужно сделать, это указать регулярные URL-ссылки, например:
<a href="/some?foo=bar">link</a>
Когда пользователь нажимает на эту ссылку,
/index.html#!/some?foo=bar
/some?foo=bar
В следующих случаях ссылки не переписываются; вместо этого браузер выполнит полную перезагрузку страницы по исходной ссылке.
Ссылки, содержащие целевой элемент
Пример: <a href="/ext/link?a=b" target="_self">link</a>
Абсолютные ссылки, которые переходят в другой домен
Пример: <a href="http://angularjs.org/">link</a>
Ссылки, начинающиеся с '/', которые приводят к другому базовому пути, когда база определена
Пример: <a href="/not-my-base/link">link</a>
Для людей, которые используют AngularUI Router. Вы можете использовать что-то вроде этого:
<a data-ui-sref="some.state" data-ui-sref-opts="{reload: true}">State</a>
Обратите внимание на параметр перезагрузки.
Нашел ответ здесь: fooobar.com/questions/25264/...
Из @Renan Tomal Fernandes ответ. ниже приведен пример
HTML
<a href="#/something" my-refresh></a>
JS
angular.module("myModule",[]).
directive('myRefresh',function($location,$route){
return function(scope, element, attrs) {
element.bind('click',function(){
if(element[0] && element[0].href && element[0].href === $location.absUrl()){
$route.reload();
}
});
}
});
Я думаю, что это более простой подход.
.directive ('a', function ($route, $location) {
var d = {};
d.restrict = 'E';
d.link = function (scope, elem, attrs) {
// has target
if ('target' in attrs) return;
// doesn't have href
if (!('href' in attrs)) return;
// href is not the current path
var href = elem [0].href;
elem.bind ('click', function () {
if (href !== $location.absUrl ()) return;
$route.reload ();
});
};
return d;
});
Предполагая, что вы хотите сделать все базовые ссылки <a>
(без атрибута target
) перезагрузкой по клику и вы используете относительные ссылки в атрибуте href
(например, /home
вместо http://example.com/home
). Вы не используете вам нужно добавить любую специальную разметку в свой HTML (пригодится при обновлении сайта с уже написанным HTML).
В моем случае, если URL-адрес такой же, ничего не работает, включая $route.reload(), $location.path(), $state.transitonTo() и т.д.
Итак, мой подход заключался в использовании Dummy Page, как показано ниже,
if( oldLocation === newLocation ) {
// nothing worked ------------
// window.location.reload(); it refresh the whole page
// $route.reload();
// $state.go($state.$current, null, { reload: true });
// $state.transitionTo($state.current, $stateParams, {reload:true, inherit: false, notify: false } );
// except this one
$location.path('/dummy');
$location.path($location.path());
$scope.$apply();
}
Вам нужно сделать модуль "/dummy" где-то, модуль ничего не делает, он только меняет URL-адрес, так что следующий $location.path() может быть применяется. Не пропустите $scope. $Apply()
Я столкнулся с этим вопросом минуту назад, за исключением того, что это была домашняя страница '/'. Я хотел простое решение с меньшим количеством кода. Я просто воспользовался методом другого метода в $routeProvider
Итак, в ссылке html выглядит:
<a href="#/home">Home</a>
так как нет страницы "/home", указанной в маршрутной панели, она будет перенаправляться на "/" с помощью метода "иначе". страницы с этой настройкой:
.otherwise({
redirectTo: '/'
});
Надеюсь, что это поможет кому-то
Я попробовал решение Wittaya выше, используя директивный подход. Как-то директива продолжает бросать ошибку. Я получаю это решение
HTML
<a href="javascript:void(0)" data-ng-click="stateGo('devices')">Devices</a>
контроллер
$scope.stateGo = function (stateName) {
if ($state.$current.name === stateName) {
$state.reload();
} else {
$state.go(stateName);
}
}
Просто попробовал добавить это
$(window).on('popstate', function(event) {
//refresh server data
});
и он отлично работает