angularjs – 刷新时点击链接与实际的url

我使用routeProvider为我的url定义控制器和模板。

当我点击与实际位置相同的链接时,没有任何反应。 我想reload()方法被调用,如果用户点击这样的链接,即使该位置没有改变。 换句话说,如果我将位置设置为相同的值,我希望它的行为相同,如果我将它设置为不同的值。

有没有办法configurationrouteProvider或locationProvider自动执行它? 或者什么是正确的做法呢? 这是往返应用程序的stadard行为,但如何在angularjs中做到这一点?

我也在谷歌组织上询问过它。

更新:

这个问题得到了很多的意见,所以我会试着解释我是如何解决我的问题。

我创build了一个自定义指令,用于链接我的应用程序,如Renan Tomal Fernandes在评论中所build议的。

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

该指令然后用于我的应用程序中的所有链接我想要这个function。

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

这个指令的作用是根据di-href href属性为你设置href属性,所以angular可以像往常一样处理它,当你把鼠标hover在链接上时,你可以看到url。 此外,当用户点击它,链接的path是相同的当前path重新加载路由。

你应该使用$ route.reload()来强制重载。

我不知道是否有“自动”的方式来做到这一点,但你可以使用ng键点击这些链接

在路由configuration中添加/(斜杠)到定义的url

我今天遇到了一个类似的问题,我在我的网页上有一个链接,当我点击它的时候,我想每次重新加载ng-view,这样我就可以从服务器刷新数据。 但是,如果URL位置不改变,angular度不会重新加载ng-view。

最后,我find了解决这个问题的办法。 在我的网页中,我将链接href设置为:

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

但是在路由configuration中,我设置了:

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

不同的是url中的最后一个斜杠。 当我第一次点击href="#/test"时,将URLredirect到#/test/ ,并加载ng-view。 当我点击第二次,因为当前的url是#/test/ ,它不等于链接中的url( href="#/test" )我点击,所以Angular触发位置更改方法,并重新加载ng-另外,Angular将URLredirect到#/test/ 。 下次我点击url,angular度再次做同样的事情。 这正是我想要的。

希望这对你有用。

您可以在链接上添加_target='_self'以强制页面重新加载。

例如

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

我在IE和Firefox上testing了1.0.5和1.2.15版本。 似乎工作正常。

以下是来自AngularJS网站的更多信息:

Html链接重写

当您使用HTML5历史API模式时,您将需要不同浏览器中的不同链接,但您只需指定常规URL链接,如:

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

当用户点击这个链接时,

  • 在旧版浏览器中,url将更改为/index.html#!/some?foo=bar
  • 在现代浏览器中,URL更改为/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>在定义基础时导致不同的基本path示例: <a href="/not-my-base/link">link</a>

适用于使用AngularUI路由器的用户 。 你可以使用这样的东西:

 <a data-ui-sref="some.state" data-ui-sref-opts="{reload: true}">State</a> 

注意重载选项。

find答案在这里: https : //stackoverflow.com/a/29384813/426840

来自@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(); } }); } }); 

在我的情况下,如果url是相同的,没有任何工作,包括$ route.reload(),$ location.path(),$ state.transitonTo()等

所以我的方法是使用虚拟页面如下,

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

您需要在某个地方创build“/ dummy”模块,该模块不会执行任何操作,只会更改url,以便可以应用下一个$ location.path()。 不要错过$ scope。$ apply()

我刚才遇到了这个问题,除了主页是“/”。 我想要一个简单的解决scheme,代码less。 我只是利用$ routProvider中的.otherwise方法

所以在html链接看起来像:

 <a href="#/home">Home</a> 

由于在routProvider中没有指定'/ home'页面,它将通过'otherwise'方法redirect到'/'。 页面设置如下:

 .otherwise({ redirectTo: '/' }); 

希望它可以帮助别人

我使用指令的方法尝试了Wittaya的解决scheme。 不知何故该指令不断抛出错误。 我结束了这个解决scheme

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

我认为这是一个更简单的方法。

 .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网站时,方便)。

试图添加这个

 $(window).on('popstate', function(event) { //refresh server data }); 

它工作正常