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

2020/10/18 13:01 · javascript ·  · 0评论

在淘汰赛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);
};

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

我使用另一种方法,尽管类似:

var viewModel = (function () {
  var obj = {};
  obj.myVariable = ko.observable();
  obj.myComputed = ko.computed(function () { return "hello" + obj.myVariable() });

  ko.applyBindings(obj);
  return obj;
})();

几个原因:

  1. 不使用this,在ko.computeds等中使用时可能会造成混淆
  2. 我的viewModel是单例,我不需要创建多个实例(即new viewModel()
本文地址:http://javascript.askforanswer.com/shengmingweiduixiangwenzihehanshudetichushitumoxingzhijiandequbie.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!