0

Как я могу избежать маршрутизации на стороне клиента, когда вы хотите перемещаться за пределами установленного списка настроек маршрутов в маршрутизаторе?Несколько SPA с использованием областей MVC - Навигация по внешним маршрутам SPA-маршрутизатора

Я создал проект с использованием Durandal.js и создал SPA внутри разных областей. Проблема, с которой я столкнулся, заключается в том, что когда я хочу перемещаться за пределы текущего SPA и в другое, или сказать на домашней странице всего приложения, которое вообще не является SPA, а просто страницей cshtml.

Что я пытался сделать, это использовать обработчик mapUnknownRoutes Durandal для перехвата, а затем использовать window.location.href для перехода. Это работает, но когда я хочу перейти на главную страницу приложения («/»), маршрутизатор соответствует «корню» SPA и не переходит на домашнюю страницу, а вместо этого корневой маршрут SPA.

Площадь маршрута в этом примере «/ spaHome» маршрут которого MVC выглядит следующим образом:

context.MapRoute(
      "spaHome_default", 
      "spaHome/{*catchall}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

Вот что я сделал, чтобы настроить Дюрандаль маршрутизатор:

var routes = [ 
    { route: ['spaHome', ''], moduleId: 'spaHome', title: "spaHome", hash: "#spaHome"}, 
    { route: 'one/anotherPage', moduleId: 'one/anotherPage', title: "one/anotherPage", hash: "#one/anotherPage"} 
]; 

router.makeRelative({ moduleId: 'viewmodels' }); 

router.map(routes) 
     .mapUnknownRoutes(function (instruction) { 
      utils.navigateToPath(instruction.fragment); 
      return false; 
     }) 
     .activate({ pushState: true, root: "/spaHome" }); 

Любые указатели или ведет в правильное направление для этого, было бы высоко оценено!

ответ

0

После некоторых проб и ошибок я смог придумать решение того, что я пытался выполнить. Это похоже на прочное решение, поэтому, надеюсь, это не вызовет никаких проблем в будущем.

Я изменил массив маршрутов и удалил маршрут по умолчанию '' с первого маршрута. Это позволило мне иметь неизвестный маршрут, чтобы уйти, когда вы хотите попасть на обычную домашнюю страницу MVC. Мне также пришлось удалить свойство «root» из функции активации маршрутизатора. Это, в свою очередь, означало, что я должен был явно объявлять маршруты в массиве маршрутов с дополнительной областью области или URL-адресом («spaHome /»).

Затем в моем обработчике mapUnknownRoutes я проверил маршрут для части области URL-адреса, и, если это существовало, я использовал SPA-маршрутизатор, чтобы показать страницу с необработанными данными для этого SPA. Else Я предположил, что маршрут существует за пределами области, и мне нужно жестко перейти к URL-адресу, используя window.location.href.

var routes = [ 
    { route: ['spaHome'], moduleId: 'spaHome', title: "spaHome", hash: "#spaHome"}, 
    { route: 'spaHome/one/anotherPage', moduleId: 'one/anotherPage', title: "one/anotherPage", hash: "#spaHome/one/anotherPage"} 
]; 

router.makeRelative({ moduleId: 'viewmodels' }); 

router.map(routes) 
    .mapUnknownRoutes(function (instruction) { 
     if (instruction.fragment.toLowerCase().indexOf("spaHome/", 0) === -1) { 
      utils.navigateToPath(instruction.fragment); 
     } else { 
      var notfoundRoute = "notfound"; 
      instruction.config.moduleId = notfoundRoute; 
      history.navigate(notfoundRoute, { trigger: false, replace: true }); 
     } 
    }) 
    .activate({ pushState: true }); 

Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать!


EDIT

Хорошо, я столкнулся с проблемой с историей, делая это. Мне пришлось добавить строку в файл durandal router.js, чтобы остановить предыдущий маршрут от добавления в очередь истории.

if (!instruction.cancelQueue) { 
       router.trigger('router:route:before-config', instruction.config, router); 
       router.trigger('router:route:after-config', instruction.config, router); 
       queueInstruction(instruction); 
      } 

Edit 2

Я также столкнулся с проблемой с этим методом, где навигация не работает совсем подходит для IE9 и ниже.