Как обрабатывать "маршрут не соответствует" на странице Ember.js и 404? - программирование
Подтвердить что ты не робот

Как обрабатывать "маршрут не соответствует" на странице Ember.js и 404?

Как я могу обработать ошибку

Uncaught Error: No route matched the URL '...'

и показать пользовательскую страницу 404?


Примечание. Этот вопрос задавали раньше, а ответил несколько месяцев назад - но больше не работает.

4b9b3361

Ответ 1

App.Router.map(function() {
  //set up all of your known routes, and then...
  this.route("fourOhFour", { path: "*path"});
});

.., где вы определили свой FourOhFourRoute, чтобы показать сообщение "no route found" по вашему выбору. Вы сможете получить доступ к первоначально запрошенному пути в маршруте fourOhFour в качестве параметра пути.

EDIT: просто для ясности - этот ответ пришел после того, как другие сообщили, что больше не работают.

EDIT 2: я обновил ответ, чтобы отразить комментарий Yehuda Katz (если я ошибаюсь, пожалуйста, LMK).

Ответ 2

Вот пример:

Я определяю последний маршрут в моем маршрутизаторе с помощью шаблона подстановочных знаков: http://emberjs.com/guides/routing/defining-your-routes/#toc_wildcard-globbing-routes

У меня есть маршрут /not-found, см. последний маршрут, определенный в моем маршрутизаторе /*path, чтобы поймать любую текстовую строку, см. https://github.com/pixelhandler/blog/blob/master/client/app/router.js#L19

Router.map(function () {
  this.route('about');
  this.resource('posts', function () {
    this.resource('post', { path: ':post_slug' });
  });
  this.resource('admin', function () {
    this.route('create');
    this.route('edit', { path: ':edit_id' });
  });
  this.route('not-found', { path: '/*path' });
});

Этот маршрут перенаправляет на /not-found, см. https://github.com/pixelhandler/blog/blob/master/client/app/routes/not-found.js

import Ember from 'ember';
export default Ember.Route.extend({
  redirect: function () {
    var url = this.router.location.formatURL('/not-found');
    if (window.location.pathname !== url) {
      this.transitionTo('/not-found');
    }
  }
});

Также любой маршрут, имеющий крючок (например, model, beforeModel, afterModel), который дает отклоненное обещание, может использовать действие error для перехода к 404.

actions: {
  error: function (error) {
    Ember.Logger.error(error);
    this.transitionTo('/not-found');
  }
}

Что делает шаблон not-found, см. https://github.com/pixelhandler/blog/blob/master/client/app/templates/not-found.hbs

<h1>404 Not Found</h1>
<p>
  Perhaps you have a link that has changed, see {{#link-to 'posts'}}Archives{{/link-to}}.
</p>

Вот моя страница 404: http://pixelhandler.com/not-found

Ответ 3

В конце вашего маршрутизатора вы можете попробовать добавить весь маршрут:

App.Router.map(function() {
  this.resource('post', ...);
  this.resource('user', ...);
  this.route('catchAll', { path: '/*' });
});

App.CatchAllRoute = ...

Ответ 4

В Ember 2.x

Внутри функции App.Router.map введите код ниже конца функции обратного вызова.

this.route('your_handler_route_name', { path: '/*path' });

Теперь для каждого маршрута НЕ catche по предыдущим определенным маршрутам будет привязан маршрут your_handler_route_name.

Ответ 5

Решение 1

Чтобы отобразить содержимое 404:

App.Router.reopen({
        handleURL: function (url) {
            try {
                return this._super(url);
            } catch (error) {
                if (error.message.match(/No route matched the URL/)) {
                    return this._super('/404');
                }
            }
        }
    });

Если вы хотите изменить URL-адрес на 404:

App.Router.reopen({
        location: locationImplementation,
        handleURL: function (url) {
            try {
                return this._super(url);
            } catch (error) {
                if (error.message.match(/No route matched the URL/)) {
                    this.transitionTo('404');
                    return this._super('/404');
                }
            }
        }
    });

Чтобы понять, что здесь произошло, см. строку 22636 в ember rc2.

Решение 2

Анализ текущего URL-адреса и проверка наличия пути или ресурса с помощью App.Router.router.recognizer.hasRoute('route.path.goes.here');