当用户访问未经授权的私人页面时,例如个人资料,我的后端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()
进行硬刷新,但这并不理想。
如何强制角度为当前路线重新加载模板?
答案 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文件。