2013-05-08 10 views
8

Sto lavorando su una SPA che vorrei utilizzare più viste principali. Ecco il mio caso d'uso:Pagine master multiple Durandal

Ho un utente che ha una pagina di profilo. All'interno di quella pagina del profilo mi piacerebbe essere in grado di visualizzare un paio di viste diverse, ad es. dettagli, opere, informazioni di contatto, ecc. Ho bisogno di essere in grado di collegare in profondità a ciascuna di queste viste. Ciascuna di queste viste deve visualizzare i dati utente di base dalla vista di layout principale.

È a mia conoscenza che dovrei usare la compose per questo e ho un po 'di codice che sembra funzionare, tuttavia, voglio essere in grado di passare i dati dalla "shell secondaria" alla sottoview attuale . Sembra che i dati dello splat non siano passati al metodo di attivazione del submodelmodello.

Nel mio viewmodel "master" ho creato un osservabile chiamato activeView che contiene una stringa corrispondente a un submodelmodello (viewmodels/user/details). Ho poi una dichiarazione ad eliminazione diretta che è la seguente:

<!-- ko compose: { 
    model: activeView(),   
    activate: true 
} --><!-- /ko --> 

Come posso passare i dati alla visualizzazione sub? O c'è un modo migliore per farlo?

Grazie in anticipo!

risposta

1

Secondo me, ko.compose non è così dinamico e sembra funzionare come il layout di Razor. Con durandal è meglio fare viste separate come è possibile e quindi collegarle al router. Sto lavorando con il modello Hot-Towel di John Papa; La mia proposta riguarda il passaggio di dati (oltre l'id) con router durandal e knockout.

Quando si inizializza la vostra applicazione (shell.js, main.js, ...) map tuoi percorsi da qualche parte (o shell.js main.js) con le impostazioni per poi filtrare. Per i percorsi che trasporterà i dati, li costruito con la (: id) proposta

router.mapRoute('view/:id', moduleId, 'Customer Details', false); 

Dove e quando alcuni percorsi necessari Si può avere uno sguardo alla soluzione di Joseph Gabriel (https://stackoverflow.com/a/16036439/2198331) per filtrare i percorsi per usa dove e quando ne hai bisogno. Dopo aver filtrato i percorsi, è possibile modificare il percorso routeInfo per trasportare i parametri (stringhe o oggetti come selectedItem).

arearoutes = ko.utils.arrayFilter(router.visibleRoutes(), function (route) { 
       // mgpe has been set at app init 
       return route.settings.mgpe === 112; 
      }); 

estendere la vostra routeInfo dai risultati del filtro con i dati che si desidera trasportare

areaRoutes.forEach(function(ar){ 
    ar.myItem = mydata; // or vm.selectedItem(); DEPARTURE LUGGAGE 
}, areaRoutes); 

tuo (myItem) è ora collegato a questi percorsi come così come ti piace Detto o detti percorso (s) porterà i tuoi dati con loro e non li perderà mai a meno che tu non abbia aggiornato lo stesso oggetto del router (myItem)

function activate(adata){ 
     vm.arrivalData(adata.routeInfo.myItem); // ARRIVAL LUGGAGE are here 
} 

un percorso può trasportare percorsi nidificati Utile per il contesto nidificato come i menu nidificati; Si può giocare con percorsi per bambini preparando il viaggio quando un percorso genitore è attiva:

router.activeItem.settings.areSameItem = function (currentItem, newItem, activationData) { 
    mybag = activationData.routeInfo; // TRAVEL (current) LUGGAGE are present here 
} 

N.B. : prima di utilizzare questo work-around è necessario considerare il problema di sicurezza e, poiché sono nuovo in Durandal, non so se questo non porterà serie conseguenze sul ciclo di vita del percorso del router. Ricorda inoltre che i nomi degli oggetti rimangono permanentemente durante la vita del router.

0

Che ne dici di creare un oggetto utente e richiederlo all'interno di ogni tuo viewmodels? La cosa facile sarebbe collegarlo all'app (cioè app.user =) Le modifiche apportate a qualsiasi osservabile in detto oggetto utente verranno aggiornate a ciascuna delle viste e dei modelli di visualizzazione all'interno della SPA.

In questo modo si sta sfruttando le capacità della biblioteca ko sub/pub

+0

L'applicazione che ho scritto questo comportamento richiede più di pochi oggetti utente. Durandal 2.0 ha introdotto "router figlio" che essenzialmente consente agli utenti di creare più shell annidate con un profondo supporto per il collegamento. Naturalmente i router per bambini erano la strada da percorrere per me. – mcottingham

+0

Capito, queste due idee (routing e un datacontext dell'applicazione) funzionano insieme. Stai creando una SPA che si inizializza sul lato client e raramente esegue un post completo. Il valore che ottieni è riuscire ad avvicinare il tuo sviluppo a un'app desktop piuttosto che alla tradizionale app Web che utilizza postback completi. Ciò significa che è possibile creare un datacontext che salva gli oggetti in memoria. In questo modo non devi passare oggetti tra le viste, puoi semplicemente mantenere un datacontext globale e passare un ID all'interno della rotta usando parametri piuttosto che interi oggetti. – onzur

Problemi correlati