【发布时间】:2012-07-01 07:25:56
【问题描述】:
我使用 routeProvider 为我的 url 定义控制器和模板。
当我单击与实际位置具有相同 url 的链接时,什么也没有发生。如果用户单击此类链接,即使位置没有更改,我也希望调用 reload() 方法。换句话说,如果我将位置设置为相同的值,我希望它的行为与将其设置为不同的值一样。
有没有办法配置 routeProvider 或 locationProvider 来自动完成?或者这样做的正确方法是什么?这是往返应用程序中的标准行为,但如何在 angularjs 中做到这一点?
我也在google groups 上问过。
更新:
这个问题得到了很多关注,所以我将尝试解释我是如何解决我的问题的。
我创建了一个自定义指令,用于在我的应用程序中进行链接,正如 Renan Tomal Fernandes 在 cmets 中所建议的那样。
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>
该指令的作用是它根据di-href 属性为您设置href 属性,因此angular 可以像往常一样处理它,并且当您将鼠标悬停在链接上时您可以看到url。此外,当用户点击它并且链接的路径与当前路径相同时,它会重新加载路由。
【问题讨论】:
-
@public0821 的答案比选择的答案好很多
-
请注意上面发布的代码示例,因为它会导致内存泄漏。
$watch()包含这条指令element.bind('click', function(event) { ... });,这意味着它将为 watcher 的每次运行创建一个单击事件处理程序,而无需释放先前的单击处理程序。
标签: javascript angularjs