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 });
它工作正常