Есть ли способ поймать все несопоставленные маршруты с помощью 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