当前位置: 首页 > 面试题库 >

声明为对象文字和函数的剔除视图模型之间的区别

公羊曜灿
2023-03-14
问题内容

在淘汰赛js中,我看到视图模型声明为:

var viewModel = {
    firstname: ko.observable("Bob")
};

ko.applyBindings(viewModel );

要么:

var viewModel = function() {
    this.firstname= ko.observable("Bob");
};

ko.applyBindings(new viewModel ());

两者之间有什么区别(如果有)?

我确实在Google的Google小组中找到了此讨论,但并没有真正给我令人满意的答案。

我可以看到我想用一些数据初始化模型的原因,例如:

var viewModel = function(person) {
    this.firstname= ko.observable(person.firstname);
};

var person = ... ;
ko.applyBindings(new viewModel(person));

但是,如果我不这样做,那么选择哪种样式有关系吗?


问题答案:

使用函数定义视图模型有两个优点。

主要优点是您可以立即访问this等于正在创建的实例的值。这意味着您可以执行以下操作:

var ViewModel = function(first, last) {
  this.first = ko.observable(first);
  this.last = ko.observable(last);
  this.full = ko.computed(function() {
     return this.first() + " " + this.last();
  }, this);
};

因此,this即使从其他范围调用,您所计算的observable也可以绑定到的适当值。

使用对象文字,您将必须执行以下操作:

var viewModel = {
   first: ko.observable("Bob"),
   last: ko.observable("Smith"),
};

viewModel.full = ko.computed(function() {
   return this.first() + " " + this.last();
}, viewModel);

在那种情况下,您可以viewModel直接在计算得到的observable中使用它,但是它的确会立即求值(默认情况下),因此您无法在对象常量中定义它,就像viewModel在关闭对象常量之后才定义它一样。许多人不喜欢将视图模型的创建未封装到一个调用中。

您可以用来确保this始终合适的另一种模式是在函数中将一个变量设置为等于的合适值,this然后改用它。就像:

var ViewModel = function() {
    var self = this;
    this.items = ko.observableArray();
    this.removeItem = function(item) {
         self.items.remove(item);
    }
};

现在,如果您处于单个项目的范围内并调用$root.removeItem,则的值this实际上将是在该级别上绑定的数据(也就是该项目)。通过在这种情况下使用self,可以确保将其从整体视图模型中删除。

bind如果不支持,则另一种选择是using ,这是现代浏览器支持的,并且KO添加了。在这种情况下,它将看起来像:

var ViewModel = function() {
    this.items = ko.observableArray();
    this.removeItem = function(item) {
         this.items.remove(item);
    }.bind(this);
};

关于这个主题,还有更多可以讨论的模式(例如模块模式和显示模块模式),但基本上使用函数可以为您提供更大的灵活性,并控制对象的创建方式和引用能力。实例专用的变量。



 类似资料:
  • 问题内容: “ Prepared Statement”是Statement的稍强版本,并且应始终至少与Statement一样快捷且易于处理。 准备好的语句可能已参数化 大多数关系数据库通过四个步骤来处理JDBC / SQL查询: 解析传入的SQL查询 编译SQL查询 规划/优化数据采集路径 执行优化的查询/获取并返回数据 对于发送到数据库的每个SQL查询,一个Statement将始终执行上述四个步

  • 问题内容: 我有一个问题:这两个声明有什么区别? 是一样的吗? 问题答案: 在可变参数上 方法参数声明中的构造通常称为varargs。在JLS中,它称为 可变arity 参数。 JLS8.4.1格式参数 列表中的最后一个形式参数是特殊的;它可以是 可变 Arity参数,由类型后面的省略号表示。 如果最后一个形式参数是类型的可变arity参数,则考虑定义类型的形式参数。然后,该方法是 可变Arity

  • 问题内容: 字符串文字和字符串对象的添加有什么区别? 例如 为什么/ 不指向与相同的位置? 问题答案: 因为不是 常量表达式 ,由于和不是,因此其结果不会被插入,即创建另一个对象来表示它,因此引用比较产生。 JLS 3.10.5字符串文字 : 使用String.intern方法,对字符串常量(或更常见的是常量表达式的值(第15.28节)的字符串)进行“ interned”,以便共享唯一的实例。 J

  • 在此处输入图像描述 声明可变对象和使用new关键字创建对象之间有什么区别?

  • 本文向大家介绍Java中定义和声明之间的区别。,包括了Java中定义和声明之间的区别。的使用技巧和注意事项,需要的朋友参考一下 对于定义和声明之间的区别,应该首先考虑其字面含义,其中包括声明或声明的“声明”方法,而描述某些实体的“定义”方法。 以下是定义和声明之间的重要区别。 序号 键 声明 定义 1 概念 声明的概念包括通知编译器有关变量的属性,例如变量的名称,其持有的值的类型以及初始值(如果有

  • 本文向大家介绍使用对象文字和构造函数创建的对象之间的主要区别是什么?,包括了使用对象文字和构造函数创建的对象之间的主要区别是什么?的使用技巧和注意事项,需要的朋友参考一下 使用对象文字创建的对象是单例对象,这意味着当对对象进行更改时,它将影响整个脚本。而如果使用构造函数创建对象并对其进行更改,则该更改不会影响整个脚本中的对象。  让我们单独讨论它们。 1)使用对象文字创建的对象 由于这些是单例,因