2014-08-15 7 views
0

Я пытаюсь использовать маршрутизацию UML с угловым интерфейсом. У меня есть три веб-страницы, клиенты могут получить доступ к первой странице по какой-либо ссылке, но если у url есть прикрепленный к ней токен, я делаю в контроллере $ state.go ('second-page'). Если токен равен нулю, я держу клиента на первой странице. Однако я хочу, чтобы клиент, нажав кнопку «Назад» в браузере, должен перейти на первую страницу. Который не бывает.Угловой интерфейс JS UI Маршрутизация

Так сценарий

клиент приходит по ссылке

'#/форма/календарь /: officeId /: лексема'

и поскольку маркер не является нулевой переход я вторая страница, которая не имеет URL-адрес теперь становится

'#/форма /'

, но когда клиент нажимает на кнопку назад он пытается перейти к

«#/форма/календарь /: officeId /: лексема»

, что приводит к циклическому переходу на вторую страницу а клиент никогда не сможет достичь первой страницы.

Просьба сообщить, как этого избежать.

Спасибо

ответ

1

Там нет ничего в маршрутизатор, который действительно разработан для этого, но это довольно легко реализовать себя. Маршрутизатор отправляет $stateChangeStart событие, которое вы можете прослушать. На втором триггере вы просто захотите заблокировать это перенаправление. Или просто перенаправлять туда, один раз:

var redirected = false; 
$rootScope.$on('$stateChangeStart', function(e, to, toParams, from, fromParams) { 
    // Redirect the user but only once 
    if (!redirected && toState.whateverYouWantToCheck) { 
     e.preventDefault(); 
     redirected = true; 
     $state.go(...); 
    } 
}); 

Это позволит вам выполнять переадресацию, но только один раз.

+0

Я пытался поставить эту функцию в мой контроллер, как это: ** app.controller ('calendarCntrl', функция ($ rootScope, $ сфера, $ stateParams, $ состояние) { вар перенаправлены = ложь; $ rootScope. $ on ('$ stateChangeStart', function (e, to, toParams, from, fromParams) { // Переадресовать пользователя, но только один раз if (! redirected && toState.token! = null) { e. preventDefault(); перенаправлены = истина; $ state.go ('form.clientInfo-маркер');} }); ** Но он не попал в функцию, я что-то пропустил? – alyn000r

+0

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

+0

Я пошел с методом замены, но это тоже работает! Спасибо, Чад! – alyn000r

1

Вы могли бы выполнить свою переадресацию из #/form/calendar/:officeId/:token в #/form/ с использованием методы замены в $location службы. Это заменит текущую запись истории браузера на новую страницу, а не добавит новую.

AngularJS описание функции замены:

заменить() - При вызове, все изменения в $ месте во время текущего $ дайджеста будет заменить текущую запись истории, вместо добавления нового.

Вы бы выполнить переадресацию так:

$location.path('/form').replace(); 

Docs for $location service

+0

Этот метод терпит неудачу, поскольку для второй страницы не существует URL-адреса, на котором выполняется путь location.path. Это изменение состояния, поэтому есть имя состояния, но не место. **. State ('form.clientInfo-token', { templateUrl: 'clientInfo.html ' }) ** – alyn000r

+0

Предполагая, что вы используете ui-router (потому что ваш пример использует службу состояния), вы можете настроить свои состояния для привязки к URL-адресу. Пример из документов ui-router: '$ stateProvider.state ('state1', {url:"/state1 ", templateUrl:" partials/state1.html "})'. Я использую этот метод в своем приложении AngularJS. – jrproctor

+0

На самом деле @jrproctor ваше решение работало для меня. Спасибо – alyn000r

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