Ответ 1
ИЗМЕНИТЬ
Как и в Durandal.js 2.0, Маршрутизатор pluggin теперь имеет встроенные дочерние маршрутизаторы, который позволяет отключать выделение из коробки.
/Edit
Ниже представлен ответ на durandal 1.2
Плагин durandal router является оберткой вокруг sammyjs.
Плагин маршрутизатора позволяет управлять стеком истории браузера, а также дает вашему спа-центру возможность связываться с страницами со спа-салоном.
Его довольно легко заставить его сделать ссылку на 1 уровень глубиной, где у вас есть 1 главное меню и страницы, которые меняются и выходят. Но что, если вы хотите иметь подменю в главном меню и обеспечить глубокую ссылку.
Когда маршрутизатор поставлен в очередь для просмотра свопинга, активатор viewmodel сначала проверяет, является ли запрос для той же страницы в вашей модели просмотра. Если это тот же вид, вы можете отменить маршрут до его появления. Отменяя маршрут, когда он вызывает ту же страницу, вы можете использовать параметры маршрута и самостоятельно обрабатывать подпрограмму.
Метод, который проверяет, является ли его вызов той же самой страницей в модели view, называемой 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 router. convertSplatToModuleId
- это функция, которая принимает свойство splat
, которое является значением маршрута, и преобразует его в модуль вспомогательной страницы, которую вы хотите показать.
Итак, эта часть была простой, но есть еще одна вещь, которая должна быть выполнена.
<div data-bind="compose: { model: subPage, afterCompose: router.afterCompose }"></div>
Ваша привязка для контейнера подстраниц должна вызвать router.afterCompose
, потому что это то, что сообщает маршрутизатору, что маршрут был завершен, и его готовность обрабатывать новые маршруты.
Это непростая задача для объяснения. Итак, я создал пример и нажал сюда github.