在$ routeChangeError上显示特定模板

时间:2014-01-03 00:40:58

标签: angularjs angularjs-routing

我有一种感觉,没有办法做到这一点,但我认为这不会有问题。我正在使用route.resolve检查路由更改时的当前用户状态,并确定它们是否已获得该路由的授权。假设它们不是,理想情况下我想简单地显示错误模板,而不是将路由更改为指向错误页面。

显然后者更直接,但感觉不对。是否有可能以这种方式处理它,或者必须在这里获得更多创意。

我考虑过的一个解决方案是在根模板中显示基于$ rooteScope.errorState的指令。不是我最喜欢的解决方案,但暂时是可行的解决方案。

3 个答案:

答案 0 :(得分:1)

ng-route原本不支持,你可以让它工作,但需要一些努力。但是,您可以使用http://angular-route-segment.com/

它使用ng-route选项增强resolveFailed,以便您可以定义一组新的控制器和模板,以便在解析器失败时使用。

答案 1 :(得分:1)

这是我最终使用的解决方案,它只使用核心ngRoute模块。自定义指令可能会使它更清洁但这确实有效。

  $rootScope.$on '$routeChangeStart', (e, route) ->
    $rootScope.errorTemplateUrl = null

  $rootScope.$on '$routeChangeError', (e, c, p, error) ->
    $rootScope.errorTemplateUrl = views['errors/' + error]

在我的项目views[]中是模板的快捷方式名称列表。在这种情况下,我可以传递类似views['errors/404']的内容,但您可以按照自己喜欢的方式获取错误模板网址。然后在我的基本视图中我有。

<div ng-if="!errorTemplateUrl" ng-view></div>
<div ng-if="errorTemplateUrl" ng-include="errorTemplateUrl"></div>

如果解析失败,我可以拒绝并传递我想要显示的错误模板的名称,然后将其正确显示。

答案 2 :(得分:0)

编辑:被误解的问题

在你的解析器中,当检测到拒绝访问时,请调用此

$templateCache.put('template.html', 'Access Denied');

然后解析路由成功。其中template.html是templateUrl的位置。