Каков правильный способ определить полный маршрут для обработки 404 в can.js таким образом, чтобы все правильные маршруты сначала проверялись? Если не совпадают, этот маршрут поймает его, и я могу отобразить сообщение 404.
Как определить полный маршрут для обработки 404 в can js?
Ответы (2)
Это лишь некоторые вещи, которые я узнал, погрузившись в исходный код и проведя несколько тестов...
Если бы я определил корень с одним параметром, например, can.route(":section") и ввел бы в адресную строку фрагмент вида "!#toronto/something/feasf" и другого подходящего маршрута нет он может в настоящее время рассматривать это как указанный выше маршрут и преобразовать его в "!#toronto%23something%23else", который согласно тестам, сгенерированным для этого маршрута, является правильным.
Способ предотвратить такое поведение заключается в определении маршрута с косой чертой в конце, can.route(":section/"), который при проверке на ложный маршрут должен переписать его на первое совпадение "toronto". То же самое применимо, если вы определяете свои маршруты в элементе управления.
Вы должны поймать недопустимый параметр в обработчике маршрута или, если он предоставлен модели, вы можете обработать ошибку в обратном вызове. Но я думаю, что это довольно ясно с самого начала.
Если вы по какой-либо причине все еще хотите поймать неправильный маршрут, я сделал следующий тест, чтобы поймать неверный маршрут. Я не предлагаю это, так как это создает ненужные накладные расходы в вашем приложении.
can.route.bind('change', function(ev, newVal) {
if (newVal === 'route') {
var valid = false;
$.each(can.route.routes, function(k,v) {
if (new RegExp(v.test).test(window.location.hash)){
valid = true;
return; //exit loop
}
})
if (!valid) {
//handle the false route here
}
}
});
Вы можете зарегистрировать подстановочный знак после всех ваших маршрутов
// Catch 404
router.register('.*', 'controller#action');