Как мне прослушать и отреагировать на пустой маршрут, используя {can.route}?
Я хочу настроить маршрутизацию с CanJS так, чтобы в зависимости от того, какой URL я нажал, был настроен соответствующий элемент управления. Моя проблема заключается в попытке найти способ выражения маршрута по умолчанию для прослушивания в элементе управления: "Если ничего не найдено, то сделайте это". Любые советы по этому вопросу?
Это мой код до сих пор. Кажется, работает для URL, как /#!/plant/1/day/3
а также /#!/plant/1
, но не для /#!
или же /
can.route('plant/:plant_id/day/:day', {});
can.route('plant/:plant_id', {});
can.route('', {});
var Router = can.Control({}, {
init : function () {},
"{can.route}" : function (route, event, newVal, oldVal) {
console.log('Init default control');
},
"{can.route} plant_id" : function (route, event, newVal, oldVal) {
console.log('Init plant control');
},
"{can.route} day" : function (route, event, newVal, oldVal) {
console.log('Init day control');
}
});
PS Мне действительно удалось сделать это с помощью плагина Can.Control.route, выполнив это:
"route" : function (route, event, newVal, oldVal) {
console.log('route Default route', arguments);
}
Но плагин route, похоже, настраивает маршруты и реагирует на них, и я хотел знать, как это сделать без специального плагина.
3 ответа
Ваше решение работает, но вы также можете использовать плагины can.Control.route, которые позволяют вам определять и прослушивать маршруты непосредственно в действии контроллера:
var Router = can.Control({
init : function(el, options) {
},
"/:plantId route" : function(data) {
// the route says /id
// data.id is the id or default value
},
route : function(data){
// the route is empty
}
});
new Router(window);
Закончилось делать что-то вроде следующего, но это кажется не идеальным...
"{can.route} change" : function (ev, attr, how, newVal, oldVal) {
if(newVal=== 'add' && (!ev.attr('plant_id') && !ev.attr('day')))
console.log('{can.route} Default route', arguments);
},
Я заметил ту же проблему с маршрутом по умолчанию '/'. Я погрузился в pushstate.js и обнаружил, что он не работает должным образом с маршрутом по умолчанию. Вы можете увидеть более подробную информацию здесь: https://forum.javascriptmvc.com/
Я ничего не тестировал без pushstate.js (используя #!), Так что это относится только к использованию pushstate.