【问题标题】:View-Model declaring of Knockout.js. There are two methods声明 Knockout.js 的视图模型。有两种方法
【发布时间】:2012-09-19 23:35:06
【问题描述】:

我将 Knockout.js 用于富客户端应用程序,它将包含大量的 knockout.js 视图模型。在开发过程中,我注意到了两种创建 knockout.js 视图模型的方法。 第一种方式。

function AppViewModel() {
this.firstName = ko.observable("Bert");
this.lastName = ko.observable("Bertington");}

第二种方式。

var appViewModel = {
this.firstName = ko.observable("Bert"),
this.lastName = ko.observable("Bertington")};

这两种声明ViewModels的方法有什么具体的区别吗? 在knockout.js official page examples,他们使用了第一种方式。但是在像Knockout-validations.js 这样的第三方框架中使用了第二种方式。我应该使用哪种方式?使用它有什么特别的优势吗?

我发现如果我使用第一种方式,那么我不能使用 Knockout-validations.js 框架。我对这个问题真的很困惑。任何意见表示赞赏。

谢谢。

【问题讨论】:

标签: javascript mvvm knockout.js viewmodel knockout-validation


【解决方案1】:

第一种方式定义了一个对象构造函数但不实例化一个新对象,你可以通过这种方式传入参数。如果您要创建多个对象/模型,这肯定不会比第二种方式笨重。

第二种方法是使用对象初始化语法,这会在内存中使用您设置的任何字段来实例化一个新对象。一般来说,这会产生更小的代码大小;如果您要创建两个结构相同或相似的对象,请使用第一种方式。

没有理由不能使用第一个代替第二个。只需创建一个新对象并将其传递到需要它的任何地方。

这个:

function AppViewModel(fName, lName) {
    var self = this;
    self.firstName = ko.observable(fName);
    self.lastName = ko.observable(lName);
}
...
var appViewModel = new AppViewModel("Bert", "Bertington");

创建与此相同的对象:

var appViewModel = {
    this.firstName = ko.observable("Bert"),
    this.lastName = ko.observable("Bertington")
};

第一个只允许创建更多AppViewModels,例如new AppViewModel("Joe", "Shmoe")

【讨论】:

    【解决方案2】:

    您描述的差异并非特定于淘汰赛或淘汰赛的库,而是在 JavaScript 社区中广泛争论的语言级别问题。 JavaScript 大师 Douglas Crockford 有两篇文章介绍了这件事的两面性:

    从分散的论坛帖子、博客文章和与 JavaScript 程序员的对话来看,社区似乎正在趋向于接受原型风格。你应该使用你喜欢的任何风格。根据文档,看起来 Knockout-Validation 库的设计考虑了古典风格。在这种情况下,古典风格的优势在于它更容易与 Knockout-Validation 库一起使用。原型方式的缺点是这个库更难使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2018-12-16
      相关资源
      最近更新 更多