РЕДАКТИРОВАТЬ
Начиная с Durandal.js 2.0 плагин маршрутизатора теперь имеет встроенный дочерний маршрутизатор, который позволяет выполнять прямые ссылки из коробка.
/Редактировать
Приведенный ниже ответ относится к Durandal 1.2
Плагин durandal router — это оболочка для sammyjs.
Плагин маршрутизатора позволяет вам управлять стеком истории браузера, а также дает вашему спа возможность ссылаться на страницы с вашим спа.
Это довольно легко сделать, связывая 1 уровень в глубину, где у вас есть 1 главное меню и страницы, которые меняются местами. Но что, если вы хотите иметь подменю с главным меню и предоставить глубокие ссылки.
Когда маршрутизатор поставлен в очередь на обмен представлениями, активатор модели представления сначала проверяет, соответствует ли запрос для той же страницы в вашей модели представления. Если это тот же вид, вы можете отменить маршрут до того, как это произойдет. Отменяя маршрут, когда он вызывает ту же страницу, это позволяет вам взять параметры маршрута и самостоятельно обработать подмаршрут.
Метод, который проверяет, вызывает ли он ту же страницу, находится в модели представления с именем areSameItem
. Вы можете переопределить этот метод внутри вашей основной модели представления, вызвав:
return App = {
router: router,
subPage: ko.observable('defaultSubPage'),
activate: function () {
router.activeItem.settings.areSameItem = function (currentItem, newItem, data) {
if (currentItem != newItem) { return false; }
else { App.subPage(convertSplatToModuleId(data.splat)); return true; }
}
}
}
Конечно, это внутри модуля amd, а router
— это подключаемый модуль маршрутизатора Durandal. convertSplatToModuleId
— это функция, которая принимает свойство splat
, которое представляет собой значения маршрута, и преобразует его в модуль подстраницы, которую вы хотите отобразить.
Итак, эта часть была легкой, но есть еще 1 вещь, которую нужно сделать.
<div data-bind="compose: { model: subPage, afterCompose: router.afterCompose }"></div>
Ваша привязка для контейнера подстраниц должна вызывать router.afterCompose
, потому что это то, что сообщает маршрутизатору, что маршрут завершен и он готов обрабатывать новые маршруты.
Это непростая задача для объяснения. Итак, я создал пример и отправил его на github здесь.
person
Evan Larsen
schedule
04.04.2013