5

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

Я использую $ locationChangeStart для отслеживания изменений маршрута. Сценарий: 1. если пользователь вошел в систему, разрешите ему доступ ко всем маршрутам, за исключением маршрутов auth (login, register). Я проверяю это, вызывая метод isAuthenticated() из моего AuthFactory 2. Если пользователь не вошел в систему, он получает доступ только к входам и регистрам маршрутов. Любой другой маршрут должен быть предотвращен, и в этом случае пользователь должен быть перенаправлен на логин.

$rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl){ 
    if(AuthFactory.isAuthenticated()){ 
    if(AuthFactory.isAuthRoute(newUrl)){ 
     event.preventDefault(); 
     $location.path('/'); 
    } 
    } else { 
    if(!AuthFactory.isAuthRoute(newUrl)){ 
     event.preventDefault(); 
     $location.path('/login'); 
    } 

    } 
}); 

Вещь, которая беспокоит меня, является единственной с preventDefault(). Если приложение достигает кода с preventDefault(), location.path(), который приходит после этого, просто не работает.

Однако, если я удалю event.preventDefault(), location.path() работ. Проблема с этим заключается в том, что мне нужно, чтобы это предотвратило, в случае, если незарегистрированный пытается получить доступ к какой-либо не-auth-странице.

В принципе, я хочу иметь возможность предотвратить или перенаправить на основе запрошенного маршрута. Каков правильный способ сделать это?

+0

Я не уверен, что вы делаете и чего хотите. Можете ли вы предоставить нам plunkr? –

+0

Эй, баба, я отредактировал мой вопрос, пожалуйста, проверьте, является ли он более кратким сейчас? – Ned

+0

По-моему, вы не используете службу определения местоположения $. Он слишком низкоуровневый. Я бы посмотрел https://github.com/angular-ui/ui-router, который намного больше подходит для задачи, которую вы описываете. –

ответ

2

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

+0

Эй, йотамша, это правда, но тогда мне нужно приложить решение и проверить все существующие и новые письменные маршруты. Я надеялся, что я сделаю это на одном месте, мой прецедент был довольно обычным, вот почему я не могу поверить, что это так сложно сделать, но похоже, что это :) спасибо за помощь! – Ned

-2

Хорошо, мне удалось это сделать, используя $ routeChangeStart. Уловка использует $ route.reload(). Так выше кода должны выглядеть примерно так:

$rootScope.$on('$routeChangeStart', function(event, next, current){ 
    if(AuthFactory.isAuthenticated()){ 
    if(AuthFactory.isAuthRoute(next.originalPath)){ 
     $route.reload(); 
     $location.path('/'); 
    }  
    } else { 
    if(!AuthFactory.isAuthRoute(next.originalPath)){ 
     $route.reload(); 
     $location.path('/login'); 
    } 
    } 
}); 

Я положил это в моем методе .run, поэтому все просьбы обрабатываются здесь, и мне не нужно думать о каждом новом маршруте, который я (или кто-то добавляет). Вот почему это выглядит более чистым для меня.
Если у кого-то есть другой подход, пожалуйста, поделитесь.

Примечание: только в случае, я делаю проверку на серверной части также :)

+2

контроллер по-прежнему вызывается, поэтому вы фактически меняете маршрут после начала изменения маршрута. – MarZab

3

Хорошо, что вам нужно сделать это:

var authPreventer = $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl){ 
    if(AuthFactory.isAuthenticated()){ 
     if(AuthFactory.isAuthRoute(newUrl)){ 
      event.preventDefault(); 
      authPreventer(); //Stop listening for location changes 
      $location.path('/'); 
     } 
    } 
    else { 
     if(!AuthFactory.isAuthRoute(newUrl)){ 
      event.preventDefault(); 
      authPreventer(); //Stop listening for location changes 
      $location.path('/login'); 
     } 
    } 
}); 
+3

Для записи это сообщение в блоге выглядит так, как оно передавалось через переводчик на другой язык и обратно на английский язык. Оригинальный пост, который срывал сисмагазин, находится здесь: http://weblogs.asp.net/dwahlin/cancelling-route-navigation-in-angularjs-controllers – enriquein

0

Я недавно была такая же проблема, и я, наконец, смог для его решения, прослушивая $routeChangeStart, а не $locationChangeStart (не нужно звонить $route.reload()).

Документация для обоих событий нечеткая ... Я полагаю, что событие $ruteChangeStart вызывается перед $locationChangeStart (я собираюсь прочитать исходный код, чтобы полностью понять, что здесь происходит).

Смежные вопросы