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

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

ko.applyBindings(viewModel );

或者:

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

ko.applyBindings(new viewModel ());

两者之间有什么区别?

我确实在knockoutjs谷歌群中找到了this discussion个,但它并没有给我一个满意的答案.

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

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

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

但如果我不这么做,我 Select 哪种风格重要吗?

推荐答案

使用函数定义视图模型有几个优点.

主要的优点是,您可以立即访问等于正在创建的实例的值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.

对于对象文字,您必须执行以下操作:

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

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

在这种情况下,您可以在计算的可观察对象中直接使用viewModel,但它确实会立即得到计算(默认情况下),因此您无法在对象文本中定义它,因为直到对象文本关闭后才定义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,可以确保将其从整体视图模型中删除.

另一种 Select 是使用bind,如果不支持,则使用现代浏览器支持并由KO添加的bind.在这种情况下,它将如下所示:

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

关于这个主题和您可以探索的许多模式(如模块模式和揭示模块模式),还有更多可以说的内容,但基本上使用函数可以让您更灵活地控制如何创建对象,并能够引用实例私有的变量.

Javascript相关问答推荐

更新Reduxstore 中的状态变量,导致整个应用程序出现不必要的重新渲染

如何使用Echart 5.5.0创建箱形图

TypScript界面中的Infer React子props

没有输出到带有chrome.Devtools扩展的控制台

在页面上滚动 timeshift 动垂直滚动条

Angular中计算信号和getter的区别

如何让npx在windows中运行js脚本?

在使用HighChats时如何避免Datatables重新初始化错误?

Html文件和客户端存储的相关问题,有没有可能?

使用ThreeJ渲染的形状具有抖动/模糊的边缘

如何在Angular拖放组件中同步数组?

同一类的所有div';S的模式窗口

VSCode中出现随机行

以编程方式聚焦的链接将被聚焦,但样式不适用

按下单键和多值

如何在HTMX提示符中设置默认值?

匹配一个或多个可选重复的特定模式

WebSocketException:远程方在未完成关闭握手的情况下关闭了WebSocket连接.&#三十九岁;

使用RxJS from Event和@ViewChild vs KeyUp事件和RxJS主题更改输入字段值

用于测试其方法和构造函数的导出/导入类