Показать определенный шаблон в $routeChangeError

У меня есть ощущение, что нет никакого способа сделать это, но я подумал, что не помешает спросить. Я использую route.resolve, чтобы проверить текущий статус пользователя при изменении маршрута и определить, авторизованы ли они для этого маршрута. Предполагая, что это не так, в идеале я хотел бы просто отобразить шаблон ошибки, а не менять маршруты, чтобы они указывали на страницу с ошибкой.

Очевидно, что последний более прямолинеен, но он не кажется правильным. Возможно ли справиться с этим таким образом или здесь придется проявить больше творчества.

Одно решение, которое я рассматривал, состоит в том, чтобы иметь директивы в корневом шаблоне, которые отображаются на основе установленного значения $rooteScope.errorState. Не мое любимое решение, но на данный момент работоспособное.


person Chris Nicola    schedule 03.01.2014    source источник


Ответы (3)


ng-route изначально не поддерживает это, вы можете заставить его работать, но это требует некоторых усилий. Однако вы можете использовать http://angular-route-segment.com/.

Он дополняет ng-route опцией resolveFailed, поэтому вы можете определить новый набор контроллеров и шаблонов для использования в случае сбоя преобразователя.

person Daiwei    schedule 03.01.2014
comment
Да, мне было интересно, может ли ui-router поддерживать эту ситуацию. Просто проверяю это, и кажется, что это довольно хорошо. Ваше здоровье! - person Chris Nicola; 03.01.2014
comment
@ChrisNicola может быть, я не пробовал ui-route раньше. angular-route-segment.com использует ng-route для внутреннего использования, а ui-route использует собственный механизм. - person Daiwei; 03.01.2014

Это решение, с которым я столкнулся, использует только основной модуль 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'], однако вы можете получить URL-адрес шаблона ошибки любым удобным для вас способом. Тогда в моем базовом представлении у меня есть.

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

Если разрешает ошибку, я могу отклонить и передать имя шаблона ошибки, который я хотел бы отобразить, для этого, который затем отображает его соответствующим образом.

person Chris Nicola    schedule 10.07.2014

редактировать: неправильно понятый вопрос

в вашем распознавателе, когда обнаружен отказ в доступе, вызовите это

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

а затем разрешить маршрут как успешный. Где template.html — это местоположение вашего templateUrl.

person Noishe    schedule 03.01.2014
comment
Правильно, но цель здесь заключалась в том, чтобы не изменить путь маршрута, а просто отобразить ошибку. - person Chris Nicola; 03.01.2014