Knockout.js 使用Durandal在一个页面中创建多个独立SPA

Knockout.js 使用Durandal在一个页面中创建多个独立SPA,knockout.js,durandal,Knockout.js,Durandal,我想在一个HTML页面中托管两个或多个单页应用程序(我们的遗留应用程序)。这些应用程序应该位于完全不同的页面位置,因此我不能使用durandal composition作为上根“shell”,也不能使用ko compose绑定进行合成。这些应用程序应该能够在它们之间进行通信(路由器/事件聚合器) 有没有可能使用Durandal和它的路由器插件来做这样的事情?最好的方法是什么 我尝试使用多个applicationHost元素,并使用不同的vm/element组合调用app.setRoot(vm,t

我想在一个HTML页面中托管两个或多个单页应用程序(我们的遗留应用程序)。这些应用程序应该位于完全不同的页面位置,因此我不能使用durandal composition作为上根“shell”,也不能使用ko compose绑定进行合成。这些应用程序应该能够在它们之间进行通信(路由器/事件聚合器)

有没有可能使用Durandal和它的路由器插件来做这样的事情?最好的方法是什么

我尝试使用多个
applicationHost
元素,并使用不同的vm/element组合调用
app.setRoot(vm,transition,element)
,但没有成功。看来最后一个电话赢了


此外,我还创建了关于Durandal google组的讨论:

您打算将它们加载到同一HTML页面中吗?如果是这样,则可以在壳中创建不同的区域,每个区域一个。也许是左和右,或者是上和下。每一个都可以位于shell中的一个节或div中,并使用
compose
绑定进行加载

当然,您可以使用Durandal中的事件在两个用户之间进行通信


如果同时加载这两个文件,则需要决定如何响应路由更改。如果地址栏中的路线发生变化,您是将活动项绑定到左侧部分还是右侧部分?这显然取决于你。您可能希望创建一种更自定义的方法来加载不同的仪表板部分内容。然而,这实际上取决于您希望如何重新加载它。

您可能可以在iframe中托管每个durandal实例。

不幸的是,确保完全独立的应用程序的唯一方法是使用不同的文档-iframe或普通框架,甚至不同的窗口。这是因为有很多共享状态,虽然Durandal是高度可配置的,但它有许多单例点:

  • 大多数durandal/*组件预期作为单体工作;应用程序中的配置是共享的。应用程序上的订阅/事件已共享。同样,默认模块查找规则也共享,因此需要使用特殊的“选择器”(即模块id上的应用程序前缀)
  • RequireJS是一个单身汉;将共享所需的查找规则
  • 淘汰赛是单打;添加bindingHandler将在所有应用程序中共享

因此,虽然可以创建一组“协作”应用程序(比如“插件”),但每个应用程序都需要了解主机并小心避免冲突。还需要与模块路径(即每个应用程序名称的前缀)合作,以提供相关的查找解决方案。

是的,如果我可以让Durandal管理整个HTML页面的shell,这将是可能的。但这是我不能做的。将加载SPA的页面结构是如下所示的常规HTML页面:>旧HTML>…>SPA1的外壳>…>旧HTML>…>SPA2的外壳>…>旧的HTMLsorry格式:)希望你能得到我的想法:)所以我在想,如果使用2个应用程序主机是个好主意,以及如何做到这一点…这也是我想尝试的-这不是理想的解决方案,但可能会奏效,thxalso请参阅Durandal google Group的讨论