Как определить перехват всех маршрутов для обработки 404 в может JS?

Как правильно определить маршрут перехвата всех для обработки 404 в файле can.js таким образом, чтобы сначала проверялись все правильные маршруты? Если не совпадают, этот маршрут поймает его, и я могу отобразить сообщение 404.

2 ответа

Вы можете зарегистрировать подстановочный знак после всех ваших маршрутов

// Catch 404
router.register('.*', 'controller#action');

Это лишь некоторые вещи, которые я изучил, погрузившись в источник и выполняя некоторые тесты...

Если я определил корень с одним параметром, например, can.route(":section") и введу в адресную строку фрагмент, который выглядит как "!# Toronto/ что-то /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
        }
    }
});
Другие вопросы по тегам