Angular重新加载当前路由并重新加载当前模板

时间:2014-02-16 21:13:53

标签: angularjs

当用户访问未经授权的私人页面时,例如个人资料,我的后端302重定向到控制器操作,该操作提供登录部分代替个人资料部分。由于302重定向到返回partial的操作,因此url地址栏不会从用户尝试访问的页面(“/ profile”)更改。

我打算“修复”但实际上我认为它可以提供良好的用户体验,而不是将返回的URL作为查询参数处理。

这个想法是一旦他们登录我只想重新加载当前路线,也就是通过“/ profile”对配置文件部分做一个GET请求,然后将其切换回而不是登录部分。

然而,我无法让这个“重装当前路线”起作用。我尝试了以下所有方法:

$location.$$compose();
$location.absUrl($location.path());
$location.url($location.path());
$location.path($location.path())
$route.reload();

但没有工作。 $ route.reload()似乎是明确的方式,但它也不起作用。它遍历路由周期,重新实例化控制器,但不执行GET请求重新加载模板

唯一有效的方法是通过location.reload()进行硬刷新,但这并不理想。

如何强制角度为当前路线重新加载模板?

2 个答案:

答案 0 :(得分:24)

好的,我找到了lgalfaso在Github上提供的解决方案(精确粘贴):

  

模板是   缓存,如果用户没有权限在页面中,那么   这项检查应在到达控制器之前或之后进行,   在控制器内,但不在模板检索

     

如果这是您想要遵循的方式,那么您需要删除   调用reload之前来自$ templateCache的模板

这对我有用,因为登录模板实际上被缓存为用户试图访问的模板。因此,删除它并让角度为当前路线重新获取正确的路线就像一个魅力。

var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$route.reload();

答案 1 :(得分:1)

我注意到$route.reload()方法重新实例化了$routeProvider.when("/someUrl",{controller:'SomeController',templateUrl:'SomeView.html'})模板,控制器和/或您在.when()方法中传递的任何已解决承诺的所有内容。< / p>

因此;在构建应用程序时,如果您希望$route.reload()重新加载所有页面并重新实例化控制器,则必须将所有内容放在<div ng-view></div>容器下并在其中包含任何菜单或页脚 templateUrl文件。