多个SPA的Durandal和MVC4区域

时间:2013-03-18 16:27:34

标签: javascript asp.net-mvc-4 asp.net-mvc-areas durandal

我有一个带有区域的互联网应用程序mvc4,对于我的组织,每个区域代表一个SPA,通过“管理NuGet包”,我安装了“Durandal 1.2.0”,“Durandal Transitions 1.2.0”和“Durandal Router 1.2.0” ”。我组织了文件夹,并从Durandal的“App”文件夹中退出“views”和“viewmodels”,并将新视图放在mvc4区域的“VIews”文件夹中,例如:

领域 - > NewArea - >视图 - > ControllerFolder - >视图 - > shell.html

然后我将'“viewmodels”放在“Script”文件夹中,例如:

脚本 - > NewArea - > ControllerFolder - >的ViewModels - > shell.js

脚本 - > NewArea - > ControllerFolder - > main.js

然后我改变了durandal JS的路径,例如在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”不在“Durandal”的“App”文件夹下时,才会发生这种情况。

请帮助我,如何在同一个项目中拥有各种SPA?

2 个答案:

答案 0 :(得分:5)

今天早上我遇到了同样的问题。我最初将项目格式化为:

  • 应用程序/ SPA1 /的ViewModels
  • 应用程序/ SPA1 /视图
  • 应用程序/ SPA2 /的ViewModels
  • 应用程序/ SPA2 /视图

使用这种结构,我碰到了与你完全相同的墙。阅读完帖子后,我将项目重组为:

  • 应用程序/的ViewModels / SPA1
  • 应用程序/的ViewModels / SPA2
  • 应用程序/视图/ SPA1
  • 应用程序/视图/ SPA2

使用此结构,导航工作正常。我设置了三个SPAS,并能够导航这三个。此结构的另一个好处是您现在遵循标准约定,因此您不必配置视图定位器。只需确保每个spa的main.js文件使用:

  • app.setRoot('view models / spa1 / shell),app.setRoot('view models / spa2 / shell)等

最后,通过这种方式构建,您可以将main.js文件移动到结构中,从而消除所有定义中的../../../。

我希望这会有所帮助。

答案 1 :(得分:5)

您可能需要考虑部署策略。例如,如果您需要优化此应用程序,则两个SPA将最终位于同一文件中。但是,您可以创建单独的文件夹,并为每个SPA提供自己的main.js文件,而不是将它们都放在app文件夹下。

在更高级的方案中,您可以创建一个“引导程序”应用程序来加载一个或另一个SPA。引导程序将包含两个SPA共有的代码。但是每个SPA(和引导程序)都可以独立优化。

有很多选择。主要是考虑您的最终部署策略,这将有助于指导您。

此外,您上面遇到的问题可能与标准约定在您的设置中不起作用的事实有关,您需要使用自己的映射覆盖某些函数。