2015-06-30 4 views
0

В Ember.js, как вы условно предотвращаете переход на основе ответа?Ember: предотвращение перехода на основе ответа

Например, если сервер возвращает 403 (в крючке модели), то отображает предупреждение и не переходит.

Это такая простая и распространенная вещь, но я не могу найти никакой документации или руководств для этого.

Это то, что я до сих пор

Ember.Route = Ember.Route.extend(InfinityRoute, { 
    actions: { 
    error: function(error){ 
     if (error.status === 403) { 
     this.store.createRecord('notice', { 
      message: "You are not authorized to view this content. Sorry man." 
     }); 
     } 
    } 

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

+0

Какой ответ? 403 на странице посетителя или на выбор модели? Помните, что добавляете в свой вопрос код и контекст? –

+0

http://guides.emberjs.com/v1.12.0/routing/preventing-and-retrying-transitions/ и http://guides.emberjs.com/v1.12.0/routing/asynchronous-routing/# toc_when-promises-reject будет хорошей отправной точкой – Knightsy

+0

@Knightsy, пожалуйста .. Я давно отказался от руководств Ember. Они жалкие и бесполезные, и я ожидаю большего от такой структуры, как этот –

ответ

1

На самом деле, возвращаясь отклоненным обещанием от model крючка (или afterModel или beforeModel воли самого по себе вызвать переход к сбою (не далее) Так что вам не нужно делать ничего конкретного, чтобы отменить переход Если вы хотите положить вверх диалоговое окно или что-то, то:..

model: function() { 
    var model = this.store.find('my-model'); 
    model . catch(displayErrorMessage); 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    return model; 
} 

Если по причине вы предпочитаете чтобы явно прервать переход, сделайте это, используя второй аргумент:

model: function(params, transition) { 
         ^^^^^^^^^^ 
    return this.store.find('my-model') . 
     catch(() => { displayErrorMessage(); transition.abort() }); 
              ^^^^^^^^^^^^^^^^^^ 
} 

ABORTING переходы в model крючках описаны на странице путеводителя "ПРОФИЛАКТИКЕ И Повторную попытку ПЕРЕХОДАХ", в http://guides.emberjs.com/v1.10.0/routing/preventing-and-retrying-transitions/:

ABORTING ПЕРЕХОДЫ В ТЕЧЕНИЕ model, beforeModel, afterModel
model, beforeModel и afterModel крючки, описанные в асинхронной маршрутизации, получают вызов с объектом перехода. Это позволяет маршрутам назначения прервать попытки переходов.

Если вы хотите, чтобы поймать и сделать что-то с все не удалось АЯКС запросы, то вы можете использовать ajaxComplete вызов. Это не Эмбер как таковой, это jQuery. Установите там свое диалоговое окно или сообщение. Сам переход автоматически прерывается ошибкой ajax, в результате чего обещание от this.store.find переходит в отклоненное состояние. Или прервите его самостоятельно.

Обратите внимание, что если вы используете загрузочное подставку, то невозможно прервать переход и остаться там, где вы находитесь. Слишком поздно.

EAGER VS. LAZY ASYNC TRANSITIONS
... После того, как вы предоставите целевое загрузочное подцель маршрута назначения, вы выбираете переход «с нетерпением», то есть, в отличие от «ленивого» значения по умолчанию, вы с нетерпением выходите из исходных маршрутов (и срывать их шаблоны и т. д.), чтобы перейти на это подставку.

+0

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

+0

На самом деле любая неперехваченная ошибка (необработанное отклоненное обещание), возвращающаяся с крючка модели, прервет переход. Так что это не твоя проблема. Проблема заключается в том, чтобы установить нужное диалоговое окно. В этом случае я бы предложил нечто такое же простое, как «ajaxComplete», чтобы обработать это. –

+0

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

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