2013-03-18 17 views
6

Ho un'applicazione internet mvc4 con aree, per la mia organizzazione ogni area rappresenta una SPA e tramite "Gestisci pacchetto NuGet" ho installato "Durandal 1.2.0", "Durandal Transitions 1.2.0" e "Durandal Router 1.2.0". Ho organizzato le cartelle e abbandonato le "viste" e "viewmodels" dalla cartella "App" di Durandal e ho inserito le nuove viste nella cartella "VIews" dell'area mvc4 ad esempio:Durandal e MVC4 Aree per più SPA

Aree -> NewArea -> Viste -> ControllerFolder -> vista -> shell.html

Poi ho messo l ' "ViewModels" nella cartella "script", per esempio:

script -> NewArea -> ControllerFolder -> ViewModels -> shell.js

script -> NewArea -> ControllerFolder -> main.js

Poi ho cambiato i percorsi per JS di Durandal, per esempio in main.js:

define(['../../../App/durandal/app', 
    '../../../App/durandal/viewLocator', 
    '../../../App/durandal/system', 
    '../../../App/durandal/plugins/router', 
    '../../../App/services/logger'], 

E ho cambiato main.js nella riga successiva:

viewLocator.useConvention('viewmodels', '../Areas/NewArea/Views/ControllerFolder/views'); 

Ma che la configurazione di cartelle non riesce perché la prossima riga chiama diverse volte il modulo "viewLocator" nella sua definizione e riscrivere la configurazione di "useConvention" con il valore di default:

app.setRoot('viewmodels/shell', 'entrance'); 

Questo comportamento accade solo quando le cartelle "viste" un d "viewmodels" non rimangono nella cartella "App" di "Durandal".

Per favore aiutami, come avere varie SPA nello stesso progetto?

risposta

5

È possibile prendere in considerazione la strategia di implementazione. Ad esempio, se è necessario ottimizzare questa app, entrambe le ZPS finiranno nello stesso file. Tuttavia, invece di averli entrambi nella cartella dell'app, puoi creare cartelle separate e assegnare a ciascuna SPA il proprio file main.js.

In scenari più avanzati, è possibile creare un'app "bootstrapper" che carica uno o l'altro dei SPA. Il bootstrapper conterrebbe il codice comune a entrambe le SPA. Ma ogni SPA (e il bootstrapper) può essere ottimizzata in modo indipendente.

Ci sono molte opzioni. Principalmente, considera la tua strategia di distribuzione finale e questo ti aiuterà a guidarti qui.

Inoltre, il problema riscontrato sopra è probabilmente legato al fatto che le convenzioni standard potrebbero non funzionare nella configurazione e sarà necessario sovrascrivere alcune funzioni con la propria mappatura.

+1

Grazie, per il tuo suggerimento, forse puoi darmi maggiori informazioni su "bootstrapper". – kuskunko

5

Mi sono imbattuto nello stesso identico problema questa mattina. Originariamente ho formattato il progetto di essere:

  • app/spa1/ViewModels
  • app/spa1/views
  • app/SPA2/ViewModels
  • app/spa2/viste

Utilizzo questa struttura ho colpito esattamente lo stesso muro che hai fatto. Dopo aver letto il tuo post, ho ristrutturato il progetto di essere:

  • app/ViewModels/spa1
  • app/ViewModels/spa2
  • app/views/spa1
  • app/views/spa2

Utilizzando questa struttura, la navigazione funziona correttamente. Ho creato tre SPAS e sono riuscito a navigare tra tutti e tre. L'altro vantaggio di questa struttura è che ora stai seguendo la convenzione standard in modo da non dover configurare il localizzatore della vista. Basta assicurarsi che il file main.js per ogni spa utilizza:

  • app.setRoot ('vista modelli/spa1/shell), app.setRoot (' vista modelli/spa2/shell), etc.

Infine, strutturando in questo modo, si spostano i file main.js nella struttura che elimina il ../../../ in tutte le definizioni.

Spero che questo aiuti.

+0

Grazie, ora sto usando la tua struttura e funziona perfettamente. – kuskunko