AngularJS路由控制器不重载

时间:2014-01-14 23:03:11

标签: javascript angularjs location routes

我有一个非常简单的AngularJS应用程序,其中包含两个路径:

#/search
#/results

当我从一条路线导航到另一条路线时,一切都按照我的预期运作。获取所需的任何资源,并完美显示内容。

问题是当我从一条路线导航到同一条路线(即,#/结果到#/结果)时,绝对没有任何反应。我从浏览器的角度理解没有发生任何事情,但我真的很喜欢AngularJS重新加载内容。

这一定很容易,但我在这方面画空白。有人可以帮我解释一下吗?

谢谢,

乔恩

3 个答案:

答案 0 :(得分:14)

当您导航到同一页面时,浏览器会忽略它 Angular.js与<a href="">的默认行为无关。

您可以做的是创建一个自定义指令

  • 使用$route.reload()重新加载当前视图(路线)。
  • 使用$location.path(newPath)导航到其他视图。

我做了example

app.directive('xref',function($route, $location){
  return {
    link: function(scope, elm,attr){
      elm.on('click',function(){
        if ( $location.path() === attr.xref ) {
          $route.reload();
        } else {
          scope.$apply(function(){
            $location.path(attr.xref);
          });
        }      
      });
    }
  };
});

在您的视图中,只需创建:

<a xref="/">Home</a>
<a xref="/links">Links</a>

答案 1 :(得分:3)

您可以检查当前路线是否与“目的地”路线相同,并调用$route reload() 方法:

  

<强>重载()
  即使$ location未更改,也会导致$ route服务重新加载当前路由   因此,ngView创建新范围,重新实现控制器。


E.g:

在HTML中:

<a href="" ng-click="toResults()">Results</a>

在控制器中:

// ...first have `$location` and `$route` injected...
$scope.toResults = function () {
    var dstPath = '/results';
    if ($location.path() === dstPath) {
        $route.reload()  ;
    } else {
        $location.path(dstPath);
    }
}

答案 2 :(得分:0)

我也使用了routeparams属性来比较url参数,它就像魅力一样。如果有人再次面临这个问题,请按照以下方式解决问题:

 if ($location.path() === '/destination' && $routeParams.Name == Name) {
                $route.reload();
            }
            else {
                $location.path('/destination').search({ Name: Name });
            }