View 使用同一虚拟机的Durandal和多个视图

View 使用同一虚拟机的Durandal和多个视图,view,model,durandal,View,Model,Durandal,我有一个客户实体的添加和编辑页面。支持每个功能的数据是相似的,但是在2个用户界面之间有不同的业务规则,并且略有不同,因此我最初的想法是创建两个单独的视图,但使用一个vm。这是一种不同于我所使用的John Papa示例的方法,因为他为每个示例都有一个单独的vm。(sessionadd.js,sessiondetail.js)。数据是相同的,所以看起来有很多重复,但也许这就是方法 两个问题:在添加/编辑的数据相同但规则不同的情况下,最佳做法是什么?我已经看到自己在做“if(mode=='add'){

我有一个客户实体的添加和编辑页面。支持每个功能的数据是相似的,但是在2个用户界面之间有不同的业务规则,并且略有不同,因此我最初的想法是创建两个单独的视图,但使用一个vm。这是一种不同于我所使用的John Papa示例的方法,因为他为每个示例都有一个单独的vm。(sessionadd.js,sessiondetail.js)。数据是相同的,所以看起来有很多重复,但也许这就是方法

两个问题:在添加/编辑的数据相同但规则不同的情况下,最佳做法是什么?我已经看到自己在做“if(mode=='add'){//stuff}或者{//its a edit}。这让我有点困扰,但我也不喜欢在视图中添加一个新字段时必须更改两个虚拟机的想法

第二个问题,我可以将视图指定为路由定义的一部分吗?我在文档中没有看到任何内容,但我仍然是框架的新手。在以下路由中,我希望第一个路由加载custedit.html,第二个路由加载custadd.html。这两个路由都使用custmaint.js vm(从不同时加载)


谢谢

您可以通过在viewmodel上定义getView()或viewUrl()自定义要使用的视图,如下所述:

至于您最初的问题,如果它们非常相似,我肯定会将编辑和添加操作合并到单个viewmodel单个视图中。共享相同的viewmodel但拆分视图可能会导致大量重复的视图代码。您可以始终将视图的元素分解为更小的视图如果你需要简化

如果“编辑”和“添加”体验的差异足以保证一个单独的视图,那么我也会创建一个单独的viewmodel(并可能考虑将视图零件和viewmodel功能拆分为更小的组件)

{ route: 'custedit', moduleId: 'viewmodels/custmaint', title: 'Edit' },
{ route: 'custadd',  moduleId: 'viewmodels/custmaint', title: 'Add'  },