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)

ПРИМЕЧАНИЕ: я буду строить это в ближайшие пару недель и могу отправить запрос на извлечение.

Другие вопросы по тегам