2016-09-16 2 views
1

Таким образом, кажется, что существует установленный шаблон, когда дело доходит до аутентификации и перехода.Переход на текущий маршрут в Ember.js

аутентификации перехода проверки -> сессии истек -> сохраняется попытка перехода -> перенаправления входа в систему -> успешный Войти -> повторять попытки попытки перехода

Это мы уже реализовали и она отлично работает. Теперь нам интересно, что делать, когда действие содержит, например, вызов для отдыха, когда аутентификация завершается сбоем из-за истекшего сеанса? Здесь мы хотим перенаправить логин, как при переходе, но вопрос в том, как мы добираемся до того, где мы были в приложении раньше? Хранение routeName недостаточно, так как могут быть динамические сегменты. Есть ли какой-либо объект ember в фоновом режиме, который хранит текущий маршрут, включая параметры URL-адреса?

+0

Возможно, вы всегда можете сохранить последний переход от действия 'willTransition' маршрута приложения и использовать его там, где это необходимо? – Thernys

+0

Вопрос: могу ли я сохранить завершенный переход и повторно использовать его позднее. Из руководства «отмените переход, вызвав переход. Abort(), и если объект перехода будет сохранен, его можно будет повторно попытаться позже, вызвав функцию transition.retry().». Я буду играть вокруг него, но я думал, что у кого-то может быть работающее решение. – dashambles

+0

Немного яснее. Долгосрочные хранилища в Эмбере назывались службой. Это простой объект, который живет продолжительностью приложения. Вы можете хранить и перезагружать оттуда все, что вам нужно, между переходами. – lependu

ответ

1

Хорошо, поэтому, чтобы отметить тот факт, что я нашел , который, как я помню, ранее искал, я пошел дальше и протестировал это для вас в приложении Ember, над которым я работаю. Короче говоря, это да, вы можете retry() сохраненный переход в любое время, и поэтому я предлагаю всегда хранить последний переход, а затем retry его при необходимости в вашем случае истечения срока действия сеанса. Ну, последний полезный переход в любом случае, ваш переход к логинному маршруту и ​​т. Д., Конечно, должен быть проигнорирован.

Возможно, вы даже сможете использовать аналогичную относительно быструю компоновку, как и сейчас. В моей заявке маршрута, routes/application.js, я добавил следующие обработчик действий

actions: { 
    willTransition: function(transition) { 
     this.set('_latestTransition', transition); 
    }, 
    saveTransition: function() { 
     var transition = this.get('_latestTransition'); 
     console.log('transition saved', transition); 
     this.set('_transitionSnapshot', transition); 
    }, 
    retryTransition: function() { 
     var transition = this.get('_transitionSnapshot'); 
     console.log('transition retry', transition); 
     transition.retry(); 
    } 
} 

Тогда для моего теста, я просто добавил две кнопки в постоянно видимом меню: один, чтобы вызвать saveTransition действия, а другая retryTransition действия , В результате, как я уже испортил, после нажатия кнопки «Сохранить», после нескольких последующих переходов, а затем нажав кнопку повтора, я вернулся на страницу, на которой был первый щелчок на кнопке сохранения. Динамические сегменты были прекрасными; У меня нет параметров запроса в любом месте, поэтому тестирование их было недостаточно быстрым для меня, но объект Transition, по-видимому, также поддерживает эти функции.

Поскольку эти обработчики действий находятся в пути приложения, до тех пор, как ничто другое в приложении не обрабатывает действия от этих имен (или особенно в willTransition случае действия получают ый, возвращая true), они будут рассмотрены здесь. Как сказано, вы можете сами использовать этот подход или сохранить необходимый переход с помощью какого-либо посредника услуг в соответствии с вашими потребностями и как это предлагается в комментариях.

+0

Хорошо спасибо! Я тоже начал смотреть на код, но не стал его тестировать. Я могу задать вопрос на досках ember, чтобы посмотреть, нормально ли это делать. Я не хочу, чтобы функциональность перестала работать над обновлением небольшой версии или чем-то еще. – dashambles

0

Посмотрите на this руководство. Особенно «Хранение и повторная переход» - часть того, что вам нужно.

Edit:

Если вы ищете реализации услуг сессии, посмотрите на сессии службы ember-simple-auth «s.

+0

Я знал об этом руководстве: это то, на чем основан механизм повторных попыток перехода в моем вопросе. В моем случае переход не происходит только из действия, например, нажатием кнопки. – dashambles

+0

Хорошо, я не уверен, что правильно понимаю. Но если у вас есть действие (нажатие кнопки), у вас есть обработчик действий. И там вы можете проверить, действительно ли сессия. Если сеанс недействителен, сохраните все, что вам нужно (для службы или для свойства), и вы можете создать переход на страницу входа. После того как пользователь восстановит сеанс (снова войдет в систему), создайте новый переход и загрузите то, что вам нужно от этой службы. – lependu

+0

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

0

Предполагаю, что вы используете ember-simple-auth. В этом случае, попробуйте добавить следующий код в ваш маршрут приложения:

actions: { 
    error: function (error, transition) { 
     /** 
     * Handle 401 error during model hook 
     */ 
     if (error.errors !== undefined) { 
      for (var i = 0; i < error.errors.length; i++) { 
       if (error.errors[i].status !== undefined) { 
        if (parseInt(error.errors[i].status) === 401) { 
         transition.abort(); 
         this.set('session.attemptedTransition', transition); 
         this.transitionTo('login'); 
         return false; 
        } 
       } 
      } 
     } 

     return true; 
    } 
} 

Эта важная линия this.set('session.attemptedTransition', transition); я взял из authenticated-route-mixin.

+0

Мы не используем simple-auth, но механизм перехода у нас очень похож на приведенный выше. Случай, о котором я спрашиваю, - это когда переход не находится в игре, а 401 из вызова отдыха в действии. Было бы неплохо иметь подобное поведение. – dashambles

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