6

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

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

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

脚本-->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?

4

2 回答 2

5

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

  • 应用程序/spa1/viewmodels
  • 应用程序/水疗中心/视图
  • 应用程序/spa2/viewmodels
  • 应用程序/水疗中心/视图

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

  • 应用程序/viewmodels/spa1
  • 应用程序/viewmodels/spa2
  • 应用程序/视图/spa1
  • 应用程序/视图/spa2

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

  • app.setRoot('查看模型/spa1/shell)、app.setRoot('查看模型/spa2/shell)等

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

我希望这有帮助。

于 2013-03-18T20:51:44.250 回答
5

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

In more advanced scenarios, you may create a "bootstrapper" app that loads one or another of the SPAs. The bootstrapper would contain code that is common to both SPAs. But each SPA (and the bootstrapper) can be optimized independently.

There are many options. Mainly, consider your final deployment strategy and that will help guide you here.

Also, the issue you have above is probably related to the fact that the standard conventions may not work in your setup, and you would need to override some functions with your own mapping.

于 2013-03-19T02:28:01.537 回答