can.routing: запуск перехода от #!/foo/bar к #! / foo
Я пытаюсь понять маршрутизацию CanJS. Пока у меня есть следующие маршруты.
can.route('plant/:plant/', {
plant : undefined,
day : undefined
});
can.route('plant/:plant/day/:day', {
plant : undefined,
day : undefined
});
У меня еще нет настроенных слушателей, так как я просто пробую это в консоли. Следующее работает отлично:
can.route.attr({plant : 1}) // ==> #!plant/1/
can.route.attr({plant : 1, day : 3}) // ==> #!plant/1/day/3
Но после того, как я это сделал, я бы хотел вызвать событие, которое поднялось бы вверх по иерархии обратно к уровню #!/ Plant/1. Я пытался делать can.route.attr({plant : 1, day : undefined})
, но это ничего не сделало. can.route.attr({plant : 1, day : null})
только что привело к #!plant/1/day/null
,
Так как мне "сбросить" маршрут, чтобы теперь "знать" что-либо о том, какой сегодня день?
2 ответа
После того, как я узнал, что can.route
по сути то, что известно как Observable
Я понял, что на самом деле я пытался удалить атрибут. И чтобы сделать это, все, что нужно сделать, это
can.route.removeAttr('day') // ==> #!plant/1/
Я столкнулся с этой же проблемой и хотел задокументировать это здесь. Лучший способ реализовать это - использовать can.route.url
метод для создания соответствующего URL-адреса маршрута. К сожалению, canjs не реализует routeTo
метод, который абстрагирует следующий код (и может также определить, использовать ли pushstate или нет, если он доступен...):
can.route('plant/:plant');
can.route('plant/:plant/day/:day');
window.location.hash = can.route.url({plant: 1}); // #!plant/1
window.location.hash = can.route.url({plant: 1, day: 2}); // #!plant/1/day/2
В идеале мы должны быть в состоянии сделать что-то вроде этого:
can.routeTo({plant: 1});
// #!plant/1 (without pushstate)
// [root]/plant/1 (with pushstate)
ПРИМЕЧАНИЕ: я буду строить это в ближайшие пару недель и могу отправить запрос на извлечение.