knockout.js真的采用MVVM模式吗?

时间:2013-08-17 09:10:54

标签: mvvm knockout.js

我是knockout.js的新手。几分钟后我读到了ko的标题特征。 我无法理解ko真的是MVVVM吗?因为他们谈论的只是数据绑定和易用性。但我确信MVVM不仅仅是数据绑定吗?

3 个答案:

答案 0 :(得分:9)

是的,knockout.js确实应用了MVVM模式。 It's explained in the documentation

  • 模型:您的应用程序的存储数据。此数据表示业务域中的对象和操作(例如,可以执行汇款的银行帐户),并且独立于任何UI。使用KO时,通常会对某些服务器端代码进行Ajax调用,以读取和写入存储的模型数据。

  • 视图模型:UI上数据和操作的纯代码表示。例如,如果您正在实现列表编辑器,则视图模型将是一个包含项列表的对象,并公开添加和删除项的方法。

    请注意,这不是UI本身:它没有按钮或显示样式的任何概念。它也不是持久数据模型 - 它保存用户正在使用的未保存数据。使用KO时,您的视图模型是纯JavaScript对象,不知道HTML。以这种方式保持视图模型的抽象使其保持简单,因此您可以管理更复杂的行为而不会迷路。

  • 视图:表示视图模型状态的可见交互式UI。它显示来自视图模型的信息,将命令发送到视图模型(例如,当用户单击按钮时),并在视图模型的状态发生变化时进行更新。

    使用KO时,您的视图只是具有声明性绑定的HTML文档,以将其链接到视图模型。或者,您可以使用使用视图模型中的数据生成HTML的模板。

答案 1 :(得分:3)

除了已经提供的答案之外,还有一些事项要记住 -

<强> MVVM

Knockout是MVVM,因为它支持良好的关注点分离。与其他JavaScript库(如jQuery)不同,它的目标是不使用与其无关的视图污染视图。

view model的目的很重要。它不会尝试操作DOM,因为只有向视图提供数据所需的逻辑才会被置于其中。

view的目的只是呈现(呈现)数据。这里没有逻辑,验证或其他逻辑代码。

model是唯一让Knockout变得有点棘手的地方。在您的项目中为Knockout使用单独的model通常是一种很好的接受做法,但许多开发人员已经发现将model混合到view model中很容易。原因很明显(有些model是非常基本的),但这只是出于易于实现的原因。

MVC vs MV *

当然SO.com上还有其他答案试图回答MV*,但我想在这里抛出0.02美元 - 其他图书馆或框架说明它们是MVC或基于MVPMV(whatever),但Knockout是我发现的唯一一个实践它在这方面所宣扬的内容的人。如果你有时间和愿望看看其他框架的结构,如Angular或Ember,你会看到存在一条模糊的线条,或多或少它们只是使用基于MVVM的模式但是调用它不同的东西。

答案 2 :(得分:0)

嗯我想它可以,但是我正在开发一个项目,其中所有样式和UI布局操作都在knockout js ViewModel文件中完成,这不是一个好习惯。