2013-04-16 12 views
5

Desidero avere una navigazione diversa per "area" della mia applicazione durale. Ho raggiunto questo obiettivo con ASP.NET MVC quando utilizzo Aree definendo una sezione Nav nella pagina di layout e disponendo di pagine di layout nidificate che implementano il nav per ogni area. La struttura vista nel Durandal è la seguente:Durandal.js: modifica le opzioni di navigazione per area

http://i1346.photobucket.com/albums/p697/user2269352/viewstructure_zps5e21e724.gif

Sto utilizzando il modello Durandal ASP.NET MVC4 e sto indovinando che potrei aver bisogno di modificare il seguente segement da shell.html

<ul class="nav" data-bind="foreach: router.visibleRoutes"> 
    <li data-bind="css: { active: isActive }"> 
     <a data-bind="attr: { href: hash }, html: name"></a> 
    </li> 
</ul> 

Suppongo che idealmente mi piacerebbe avere pagine html separate che potrebbero essere caricate in questa sezione a seconda di quale area/pagina sto visualizzando.

risposta

10

È possibile eseguire questa operazione aggiungendo un oggetto impostazioni alle informazioni sul percorso e specificando il nome dell'area. Con quello in atto, crea un osservabile calcolato rispetto alla collezione visibleRoutes del router che seleziona solo i percorsi per l'area corrente.

Non sono sicuro che la configurazione del percorso assomiglia, ma un esempio di aggiunta impostazioni sarebbe qualcosa di simile:

var routes = [ 
    { url: 'one/page1', moduleId: 'viewmodels/one/page1', name: 'Page 1', visible: true, settings: {area: 'one'} }, 
    { url: 'two/page1', moduleId: 'viewmodels/two/page1', name: 'Page 1', visible: true, settings: {area: 'two'} } 
]; 
router.map(routes); 

nel modello vista in cui si sta controllando il codice HTML di navigazione:

//filter the visible routes for the current area 
viewModel.areaRoutes = ko.computed(function() { 
    var area = this.area; 
    return ko.utils.arrayFilter(router.visibleRoutes(), function (route) { 
     return route.settings.area === area; 
    }); 
}, viewModel); 
+0

Abbastanza intelligente, Joseph .. Dovrò provarlo. – mikekidder

+0

Penso che ci sia un supporto esplicito anche per le aree in Durandal, ma questa tecnica è utile. –

+0

@JosephGabriel sai dove possiamo trovare informazioni sul supporto di Durandal per le aree. Non riesco a trovare nessuno online. –

1

La soluzione basata su Joseph Gabriel funziona per me e suona con router.activeItem.settings.areSameItem Posso impostare il gruppo di ogni percorso in qualsiasi punto del mio layout.

router.activeItem.settings.areSameItem = function (currentItem, newItem, activationData) { 
    return currentItem == newItem; //replace this with your own code 
}; 
Problemi correlati