我刚刚开始搞乱Knockout JS,我有以下场景(示例)。
我有一个游客列表,该列表有CRUD方法-都工作得很好。现在,当我单击一个游客时,将显示更详细的描述—这是对服务器的一个新的AJAX调用,以获取该信息。
我的问题是,我是否应该有一个包含我的TouristsViewModel
和TouristsInfoViewModel
的主视图模型-这意味着TouristsViewModel
应该与主视图耦合以修改TouristsInfoViewModel
,或者我的TouristsViewModel
应该实例化TouristsInfoViewModel
并调用ko.applyBindings
?
我已经看过Knockout-postbox,但我想避免引入太多的第三方插件。
总结一下:分离视图和视图模型的通用方法是什么,同时又能在它们之间共享数据?这是一个通用的方法。
- 投入你的时间去学习AMD和require.js是一个很好的库。 保持你的视图模型分开,不要耦合它们。
- knockout-postbox, amplify.js pub/sub之间的通信效果非常好。
- 看看单页应用程序框架。Durandal是个不错的选择。
- 如果你不打算使用Durandal或SPA,即使这样,也要创建一个单独的模块来处理你的绑定。
- 每个视图应该有一个相应的视图模型
- 将ajax调用分离到自己的模块中。例如:tourstsrepository .js可以是一个模块,它将为你做所有的ajax调用。 使用承诺。js或jquery的延迟承诺将帮助您解决这个问题。你的仓库应该返回承诺。
- 你的视图模型应该只是…本质上,它应该保存状态并提供视图交互处理程序。模型应该是它自己的文件。然后ViewModel可以保存模型数据。
- 应该只通过存储库检索模型数据。
我认为这将是一个不错的方法,对你来说会有用的。
EDIT -根据评论添加更多
1)你可以在require中使用shimming和exports来加载验证插件,而不是使用define。除非你一开始就不使用require来加载它。
2)使用pub/sub不是耦合。当一个模块完全依赖于另一个模块的功能或存在时,就会发生耦合。考虑到MasterViewModel直接与另一个视图模型通信是耦合的。在pub/sub场景中,你的一个视图模型(称为Persons.js)是保存一个person对象。保存之后,它应该更新本地缓存。在这种情况下,Person .js在保存之后,发送一条消息说"Person已保存"并传递它所拥有的任何数据。cleararch .js负责清除缓存。它只监听"Person saved"消息来执行一些操作。耦合的方式将是person .js实例化clearache并直接调用它的clearache方法。所以,要让Persons.js存在,cleararch .js必须存在。在pub/sub中,即使cleararch .js不存在,person .js也可以继续存在。
这个问题的答案完全取决于你的应用需求。通常,我有一个名为binder.js的中间模块。.js,监听消息。假设用户想要查看详细信息并点击了一个游客。tourstsviewmodel将发布一条消息"Tourist Detail Requested",并传递一个游客id或一些信息。绑定器正在监听这一点,它知道要实例化哪个视图模型以及要采取什么操作。这样,ToursistsViewModel就完全不知道toursistsinfoviewmodel。如果在另一个视图中,您列出了所有游客的firstNames和lastNames,并且不需要显示详细信息,则可以重用TouristsViewModel,而不必不必要地引入TouristsInforViewModel。在这种情况下,MasterViewModel是不需要的。
您的应用程序听起来像是单页应用程序的完美候选。遵循"一个视图-一个视图模型"方法和"单一责任"方法。TouristsViewModel只显示游客,TouristInfoViewModel将显示游客信息。他们俩都不了解对方。我最近从事的一个项目也有类似的要求。演讲者,演讲者细节,会话,会话细节。我的视图模型都不知道对方的存在。它们都是通过客户端路由和哈希更改事件来管理的。