Как определить полный маршрут для обработки 404 в can js?

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


person Adgezaza    schedule 11.12.2012    source источник


Ответы (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
        }
    }
});
person Adgezaza    schedule 14.12.2012

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

// Catch 404
router.register('.*', 'controller#action');
person Eric Saboia    schedule 25.06.2015