2015-09-02 10 views
1

Я уверен, что на это ответили тысячу раз, но я не могу понять, почему я могу только перенаправлять, используя window.location.href после нескольких часов поиска. Что происходит?Угловое перенаправление не работает

angular.module(..., []) 
.config([..., function(...) { 
     /* Route Provider and ngRoute reference removed as per comment below */ 
     $stateProvider 
      .state('login', { 
       url : '/login', 
       controller: 'loginCtrl', 
       templateUrl: '/login' 
      }) 

      .state('home', { 
       url: '/', 
       templateUrl: '/views/index', 
       controller: 'HomeCtrl' 

      }); 
     $locationProvider.html5Mode(true); 
    } 
]) 
    .run(['$state', '$rootScope', function ($state, $rootScope) { 
    $rootScope.$on('$stateChangeStart', function (e, toState, toParams, fromState, fromParams) { 
      if ($rootScope.username == null || $rootScope.password == null) { 
       if (toState.templateUrl == "/login") { 

       } else { 
         event.preventDefault(); 
         $state.go("login"); 

       } 
      } 
     }); 
    } 
]); 

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

Однако при отображении страницы приветствия, хотя имя пользователя и пароль равны нулю, он остается на странице приветствия. Ввод /login в браузер работает должным образом.

По Angular $location.path not working:

   /* snip */ else { 
        $rootScope.$apply(function() { 
         $location.path('login'); 
        }); 
       } /* snip */ 

дает мне ошибку: $digest already in progress.

Дальнейшие детали: Я только что узнал, что если я удалить $locationProvider.html5Mode(true); линию, stateChangeStart не вызывается, когда я загрузить страницу. Сервер ASP.Net.

Редактировать 2 Похоже, что угловой фактически получает страницу входа в систему, но не знает, куда ее поместить?

+0

Я уверен, что вы смешиваете собственные модули 'ngRoute' и' UI-Router' Angular. – muenchdo

+0

Место event.preventDefault(); после вашего перенаправления, а также использовать $ state.go ('login') и удалить $ location.path ('login'); – XGreen

+0

@XGreen Итак, вы имеете в виду '$ rootScope. $ Apply (function() {$ state.go (" login "); event.preventDefault();});'? Кажется, не имеет никакого эффекта - остается на домашней странице без ошибок. – David

ответ

0

В функции выполнения углового использования:

$rootScope.$on('$stateChangeStart', function (event, toState) { 
    if (toState.name != 'login') { 
     $state.go('login'); 
     event.preventDefault(); 
    } 
}); 

использовать только stateProvider для настройки маршрутов.

Следуйте инструкциям здесь using AngularJS html5mode with nodeJS and Express

или на апача:

https://ngmilk.rocks/2015/03/09/angularjs-html5-mode-or-pretty-urls-on-apache-using-htaccess/

для правильной установки html5 PushState для угловых JS на узле (если то, что ты с использованием на сервере)

+0

не вступает в силу. Взгляните на этот скринкап: http://i.giphy.com/3oEdv7sewygkOhGidi.gif – David

+0

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

+0

Я просто попробовал это сейчас, позвольте мне обновить код. – David

0

Click here и прочитайте то, что я написал для проверки подлинности, более или менее то, что вы можете найти полезным.

+0

Первое, что я могу вам предложить, это удалить $ locationProvider.html5Mode (true), если у вас нет .htaccess (если вы в Linux), это может быть проблематично. –

+0

Это очень хороший момент, у Дэвида есть реализация на стороне сервера, поддерживающая режим html5? – XGreen

+0

Вам нужно настроить перенаправление для свойства html5 pushState для работы. Это не просто дело клиента.http://stackoverflow.com/questions/17777967/using-angularjs-html5mode-with-nodejs-and-express – XGreen

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