2013-03-18 14 views
6

Mam aplikację internetową mvc4 z obszarami, dla mojej organizacji każdy obszar reprezentuje SPA i poprzez "Zarządzam pakietem NuGet" Zainstalowałem "Durandal 1.2.0", "Durandal Transitions 1.2.0" i "Durandal Router 1.2.0". Zorganizowałem foldery i opuściłem "widoki" i "viewmodels" z folderu "App" w Durandal i wstawiłem nowe widoki do folderu "Widok" obszaru mvc4, na przykład:Obszary Durandal i MVC4 dla wielu SPA

Obszary -> Nowa strona -> Widoki -> ControllerFolder -> widoki -> shell.html

Następnie kładę „ "ViewModels" w folderze "skrypt" na przykład:

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

Skrypty -> NewArea -> ControllerFolder -> main.js

Potem zmienił ścieżki dla JS z Durandal, na przykład w main.js:

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

I zmienił main.js w następnym wierszu:

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

jednak, że konfiguracja nie powiedzie się, ponieważ foldery obok linia nazywa różnych porach moduł „viewLocator” w jej definicji i przepisać konfigurację „useConvention” o wartości domyślnej:

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

To zachowanie tylko wtedy, gdy foldery „wyświetleń” d "viewmodels" nie pozostają w folderze "App" w "Durandal".

Proszę mi pomóc, jak mieć różne SPA w tym samym projekcie?

Odpowiedz

5

Być może warto rozważyć strategię wdrażania. Na przykład, jeśli chcesz zoptymalizować tę aplikację, oba obiekty SPA znajdą się w tym samym pliku. Jednak zamiast przechowywać je w folderze aplikacji, można tworzyć osobne foldery i nadawać każdemu SPA własny plik main.js.

W bardziej zaawansowanych scenariuszach można utworzyć aplikację "bootstrapper", która ładuje jeden ze SPA. Program ładujący zawierałby kod wspólny dla obu OSów. Ale każde SPA (i bootstrapper) może być zoptymalizowane niezależnie.

Istnieje wiele opcji. Przede wszystkim zastanów się nad ostateczną strategią wdrażania, która pomoże Ci w tym miejscu.

Problem, który pojawił się powyżej, jest prawdopodobnie związany z tym, że standardowe konwencje mogą nie działać w konfiguracji, a niektóre funkcje trzeba zastąpić własnym mapowaniem.

+1

Dzięki, dla twojej sugestii, może możesz dać mi więcej informacji o "bootstrapper". – kuskunko

5

Dziś rano spotkałem się z tym samym problemem. I pierwotnie sformatowany projektu będzie:

  • app/SPA1/ViewModels
  • app/SPA1/widoki
  • app/SPA2/ViewModels
  • app/SPA2/widoki

Korzystanie tę strukturę uderzyłem dokładnie w tę samą ścianę co ty. Po przeczytaniu Twojego posta, ja zrestrukturyzowane projektu będzie:

  • app/ViewModels/SPA1
  • app/ViewModels/SPA2
  • app/views/SPA1
  • app/views/SPA2

Korzystając z tej struktury, nawigacja działa dobrze. Założyłem trzy SPAS i byłem w stanie poruszać się we wszystkich trzech. Inną zaletą tej struktury jest to, że postępujesz zgodnie ze standardową konwencją, więc nie musisz konfigurować lokalizatora widoku. Wystarczy upewnić się, że plik main.js dla każdego spa wykorzystuje:

  • app.setRoot ('view modele/SPA1/shell), app.setRoot (' view modele/SPA2/shell), etc.

Wreszcie, tworząc taką strukturę, przenosisz pliki main.js do struktury, która eliminuje ../../../ we wszystkich twoich definicjach.

Mam nadzieję, że to pomoże.

+0

Dzięki, teraz używam twojej struktury i działa dobrze. – kuskunko

Powiązane problemy