Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

angularjs - refresh when clicked on link with actual url

I use routeProvider to define controlers and templates for my urls.

When I click on the link, which has the same url as is the actual location, nothing happens. I would like the reload() method to be called if a user clicks on such a link even if the location hasn't changed. In other words, if I set the location to the same value, I would like it to behave the same as if I would set it to different value.

Is there a way to configure routeProvider or locationProvider to do it automatically? Or what is the right approach to do this? This is stadard behaviour in round trip applications, but how to do it in angularjs?

I've asked it on google groups as well.

UPDATE:

This question is getting lots of views, so I will try to explain how I solved my problem.

I created a custom directive for linking in my app as Renan Tomal Fernandes suggested in comments.

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();                     });                 });             }         });     } }]); 

The directive is then used for all links in my app I want to have this functionality.

<a di-href="/home/">Home</a> 

What this directive does is that it sets the href attribute for you based on di-href attribute so angular can handle it like always and you can see the url when you hover over the link. Furthermore when user clicks on it and the link's path is the same as the current path it reloads the route.

like image 638
davekr Avatar asked Jun 29 '12 18:06

davekr


2 Answers

Add a / (slash) to the defined url in the route configuration

I met a similar problem today, I have a link in my web page and when I click it, I want the ng-view reload each time, so that I can refresh data from server. But if the url location doesn't change, angular doesn't reload the ng-view.

Finally, i found a solution to this problem. In my web page, I set the link href to:

  • <a href="#/test">test</a>

But in the route config, I set:

  • $routeProvider.when('/test/', { controller: MyController, templateUrl:'/static/test.html' });

The different is the last slash in url. When I click href="#/test" for the first time, angular redirect the url to #/test/, and load ng-view. when i click it second time, because the current url is #/test/, it's not equal to the url in the link (href="#/test") I clicked, so Angular triggers the location change method and reloads the ng-view, in addition Angular redirects the url to #/test/ again. next time i click the url, angular does the same thing again. Which is exactly what I wanted.

Hope this was useful for you.

like image 75
public0821 Avatar answered Oct 02 '22 20:10

public0821


You can add a _target='_self' on the link to forces the page to reload.

e.g.

<a href="/Customer/Edit/{{customer.id}}" target="_self">{{customer.Name}}</a> 

Tested with version 1.0.5 and 1.2.15 on IE and Firefox.

Here's more information from AngularJS site :

Html link rewriting

When you use HTML5 history API mode, you will need different links in different browsers, but all you have to do is specify regular URL links, such as:

<a href="/some?foo=bar">link</a> 

When a user clicks on this link,

  • In a legacy browser, the URL changes to /index.html#!/some?foo=bar
  • In a modern browser, the URL changes to /some?foo=bar

In cases like the following, links are not rewritten; instead, the browser will perform a full page reload to the original link.

  • Links that contain target element Example: <a href="/ext/link?a=b" target="_self">link</a>

  • Absolute links that go to a different domain Example: <a href="http://angularjs.org/">link</a>

  • Links starting with '/' that lead to a different base path when base is defined Example: <a href="/not-my-base/link">link</a>

like image 21
Andy Avatar answered Oct 02 '22 19:10

Andy