Области Durandal и MVC4 для нескольких SPA

У меня есть интернет-приложение mvc4 с областями, для моей организации каждая область представляет собой SPA, и через «Управление пакетом NuGet» я установил «Durandal 1.2.0», «Durandal Transitions 1.2.0» и «Durandal Router 1.2.0». Я упорядочил папки и удалил «представления» и «модели представлений» из папки «App» Durandal и поместил новые представления в папку «Views» области mvc4, например:

Areas-->NewArea-->Views-->ControllerFolder-->views-->shell.html

Затем я помещаю «viewmodels» в папку «Script», например:

Скрипты-->NewArea-->ControllerFolder-->viewmodels-->shell.js

Скрипты-->NewArea-->ControllerFolder-->main.js

Затем я изменил пути для JS durandal, например, в main.js:

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

И я изменил main.js в следующей строке:

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

Но эта конфигурация папок терпит неудачу, потому что следующая строка несколько раз вызывает модуль «viewLocator» в его определении и переписывает конфигурацию «useConvention» со значением по умолчанию:

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

Такое поведение происходит только тогда, когда папки «views» и «viewmodels» не остаются в папке «App» «Durandal».

Пожалуйста, помогите мне, как иметь разные SPA в одном проекте?


person kuskunko    schedule 18.03.2013    source источник


Ответы (2)


Возможно, вы захотите рассмотреть свою стратегию развертывания. Например, если вам нужно оптимизировать это приложение, оба SPA окажутся в одном файле. Однако вместо того, чтобы иметь их оба в папке приложения, вы можете создать отдельные папки и предоставить каждому SPA свой собственный файл main.js.

В более сложных сценариях вы можете создать приложение «начальной загрузки», которое загружает тот или иной SPA. Начальный загрузчик будет содержать код, общий для обоих SPA. Но каждый SPA (и загрузчик) можно оптимизировать независимо.

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

Кроме того, проблема, с которой вы столкнулись выше, вероятно, связана с тем, что стандартные соглашения могут не работать в вашей настройке, и вам нужно будет переопределить некоторые функции с помощью собственного сопоставления.

person EisenbergEffect    schedule 19.03.2013
comment
Спасибо за ваше предложение, может быть, вы можете дать мне больше информации о загрузчике. - person kuskunko; 19.03.2013

Я столкнулся с точно такой же проблемой сегодня утром. Первоначально я отформатировал проект следующим образом:

  • приложение/спа1/вьюмоделс
  • приложение/спа1/просмотры
  • приложение/spa2/просмотр моделей
  • приложение/спа2/просмотры

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

  • приложение/просмотр моделей/спа1
  • приложение/просмотр моделей/спа2
  • приложение/просмотры/спа1
  • приложение/просмотры/спа2

Используя эту структуру, навигация работает нормально. Я установил три SPAS и смог перемещаться по всем трем. Другое преимущество этой структуры заключается в том, что теперь вы следуете стандартному соглашению, поэтому вам не нужно настраивать локатор представлений. Просто убедитесь, что файл main.js для каждого спа использует:

  • app.setRoot('просмотреть модели/spa1/shell), app.setRoot('просмотреть модели/spa2/shell) и т. д.

Наконец, структурируя таким образом, вы перемещаете файлы main.js вверх по структуре, что устраняет ../../../ во всех ваших определениях.

Надеюсь, это поможет.

person Woods    schedule 18.03.2013