ember.js - обработка уровня приложения - PullRequest
0 голосов
/ 11 октября 2019

У меня есть приложение Ember.js 3.8, в котором мне нужна обработка ошибок на уровне приложения. Я прочитал, как представляется, соответствующую часть документации , но она не работает так, как я ожидал.

У меня есть компонент для проверки:

исключение-создатель.hbs

<div class="panel panel-info">
  <div class="panel-heading">Development Only - Exception Creator</div>
  <div class="panel-body">
    <p>Press the button below to create an exception</p>
    <button {{action 'throw' }}>Throw an Exception</button>
  </div>
</div>
{{yield}}

исключение-создатель.js

import Component from '@ember/component';

export default Component.extend({
  actions: {
    throw(){
      alert("About to throw an exception");
      throw new Error('Whoops!');
    }
  }
});

И (согласно моему чтению документа) Я создал маршрут application-error

application-error.hbs

<h1>Error Handler</h1>
<p>This is the error handler</p>
{{outlet}}

application-error.js

import Route from '@ember/routing/route';

export default Route.extend({
});

Когда я нажал кнопку, я ожидал (после предупреждения) перенаправить его на шаблон application-error ... но это не так. Что происходит, так это то, что консоль отладки показывает «Uncaught Error: Whoops!».

Может кто-нибудь сказать мне, где я иду не так, пожалуйста?


EDIT

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

Я создал новый маршрут exception-testing-route

exception-testing-route.js

import Route from '@ember/routing/route';

export default Route.extend({
  model() {
    throw new Error('Whoops - something bad happened at exception-testing-route');
  },
   actions: {
    error(error, transition) {
      console.log("The action 'error' is firing in the route exception-testing-route.");
      console.log("About to return true to bubble the error.");
      return true;
      }
  },
});

exception-testing-route.hbs

{{outlet}}

Если действие error вернет true, это приведет к возникновению ошибки, в данном случае к маршруту application-error следующим образом

application-error.js

import Route from '@ember/routing/route';

export default Route.extend({

  setupController(controller, error) {
    console.log("application-error setupController firing");
    console.log(error.message);
    this._super(...arguments);
  }

});

application-error.hbs

<h1>Error Handler</h1>
<p>This is the error handler</p>
{{outlet}}

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

enter image description here

1 Ответ

2 голосов
/ 11 октября 2019

Я полагаю, что вы, возможно, пропустили эту часть документации:

Как и в случае подсостояния загрузки, при сгенерированной ошибке или отклоненном обещании, возвращенном из модели [...] маршрута. hook (или beforeModel или afterModel) Ember будет искать шаблон ошибки или маршрут ...

Акцент добавлен для пояснения. В настоящее время ваш код выдает ошибку из действия, но Ember будет маршрутизировать в состояние ошибки только в том случае, если ошибка или отклоненное обещание было выброшено / возвращено из перехватчиков маршрута model, beforeModel или afterModel (и, возможно, изпереход, хотя документы немного двусмысленны, и у меня нет времени, чтобы проверить это прямо сейчас).

Так что, чтобы добраться до маршрута ошибки приложения, вам нужно выдать ошибку иливернуть отклоненное обещание в хуке model, beforeModel или afterModel какого-либо маршрута.

...