Есть ли способ поймать все несопоставленные маршруты с помощью Backbone?

Я хочу иметь маршрут "поймать все", который выполняется, когда ни один из других определенных маршрутов не совпадает. Тип 404 NotFound обработчик ошибок.

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

this.route(/(.*)/, 'notFound', this.notFound);

Кто-нибудь решил эту проблему раньше?

7 ответов

Решение

Отвечая здесь для полноты.

Вы можете сделать это 2 способами. Определите регулярное выражение, используя route()как в вопросе. Однако из-за этой ошибки вам нужно будет определить все маршруты через route() метод, и в обратном порядке (бросок вверху). Это мешает вам использовать хэш маршрутов, поэтому (мой) предпочтительный метод:

routes: {
  'users/search': 'searchUsers',
  'users/:id': 'loadUser',

  '*notFound': 'notFound'
}

Ключ '*notFound' на самом деле может быть что-нибудь, начиная с *, Вам просто нужны символы после * предотвратить ошибку разбора.

Есть еще один, возможно, более простой / более элегантный способ решить эту проблему. Backbone.History.start() возвращает true или false в зависимости от того, соответствует ли он маршруту или нет. Итак, если вы просто делаете:

if (!Backbone.history.start()) router.navigate('404', {trigger:true});

вместо обычного:

Backbone.History.start();

это будет иметь тот же эффект, что и другие ответы.

Этот очень крошечный плагин выполняет свою работу: https://github.com/STRML/backbone.routeNotFound

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

Без примера вашего текущего кода маршрутизации я бы предположил, что ваш маршрут "поймать весь маршрут" - последний маршрут, который должен работать для вас

Вы можете взломать его, чтобы создать магистраль следующим образом:

var _loadUrl = Backbone.history.loadUrl;
Backbone.history.loadUrl = function (fragment) {
    var result = _loadUrl.apply(Backbone.history, fragment);
    // the loadUrl returns false if no route was found.
    if(!result){
        // call 404 route on router if it exists.
        var handler = Backbone.history.handlers.filter( o => o.route.test("404") )
        if(handler.length) {
            Backbone.history.navigate("/404")

        }
    }
}

Тогда в вашем роутере вы можете сделать так:

var Router = Backbone.Router.extend({
    routes: {
        "404": "pageNotFound"
    },

    pageNotFound: function () {
        alert("trigger pageNotFound route")
    }
});

Просто добавьте его как последний маршрут в списке. Таким образом, он будет выбран только как запасной вариант.

Я думаю, что это не должно пройти JavaScript для решения, должен быть язык для решения, например, PHP. На стороне сервера обработка слов, если у вас есть условие, вы можете ответить головой с ошибкой 404

Другие вопросы по тегам