MVVM:viewModel应该像视图一样架构还是像模型一样

时间:2014-10-01 08:49:30

标签: javascript mvvm knockout.js architecture

在我们的KnockoutJS项目(MVVM数据绑定库)中,我们有两种类型的viewModel发生冲突。 一方面,我们有像视图一样架构的viewModel。所以,假设我有一个允许我创建用户的表单,它是一个formVM。并且viewModel的每个属性都是表单的属性。每个属性都是一个将在业务模型上写入的计算。

另一方面,我们的viewModel的架构类似于业务模型。在我们之前的示例中,它将是userVM,具有模型的基本属性以及其他(例如根据用户名等计算的标签)。在视图html中,我们在此处使用userVM.label。

一个比另一个更正确吗?你用哪一个?

1 个答案:

答案 0 :(得分:2)

我会说两者都不正确。肯定不应该是您的视图模型中的任何业务逻辑。此逻辑属于您的业务层。 viewmodel应该只保存一个模型(将observable绑定到表单字段)并在适当的时候将其传递给业务层。

严格地说,我认为viewmodel应该只包含你的视图(observables),事件处理程序以及其他很少的模型。当用户与UI交互时,您的事件处理程序将收集必要的信息并将其传递给业务层。此业务层可能会返回视图的数据,例如您提到的计算标签。然后可以将此值插入到“哑”可观察对象中,因此可以在视图中显示,而不会有任何业务逻辑进入您的视图模型。

当用户点击保存时,您从可观察数据中获取数据并将其传递给业务层,业务层将作出响应(成功保存更改,或出现问题)。 viewmodel可以使用此响应来更新UI。

简而言之,viewmodel处理UI显示的内容,并处理用户完成的任何交互。但它通常只包含愚蠢的功能,可以将信息传递给包含智能的模块。

这是我的观点,说实话:在实践中,我经常违反这个原则。

相关问题