javascript - knockout 可观察数组计算

标签 javascript arrays knockout.js

我正在尝试为 observableArray 实现一个简单的“toString”函数。

当使用这个对我来说最合适的代码时

var viewModel = {

  name: ko.observable('test'),
  arr: ko.observableArray(['item1']),

  third: ko.computed(function(){

    return this.arr().join();
  })
};

ko.applyBindings(viewModel);

得到一个this.arr is not a function错误

为什么会这样?

如果我这样运行它,一切正常。

var viewModel = {

  name: ko.observable('test'),
  arr: ko.observableArray(['item1']),

  third: function(){

    return this.arr().join();
  }
};

ko.applyBindings(viewModel);

如果我使用第二种方法,我会得到正确的 arr 内容吗?每次从 arr 添加/删除项目时,第三个变量都会更新吗?

https://jsfiddle.net/zek2kz2b/5/

最佳答案

发生的事情是您计算的 this 不是 View 模型,因此它没有 arr 方法。

您需要为您的计算提供 this 上下文,以便在它被调用时使用。您可以通过在 ko.computed 调用中向 View 模型传递第二个参数来完成此操作。

但是因为您将 View 模型创建为普通对象,所以在调用 ko.computed 时您没有要传递的 View 模型。因此,改为将 View 模型创建为构造函数:

function ViewModel() {
  var self = this; // Capture the view model as self to simplify things
  self.name = ko.observable('test'),
  self.arr = ko.observableArray(['item1']),
  self.third = ko.computed(function(){
    return this.arr().join();
  }, self); // We now have the view model available to pass here
};
ko.applyBindings(new ViewModel());

另一种方法是简单地将 self 引用引用到计算中的 View 模型:

function ViewModel() {
  var self = this;
  self.name = ko.observable('test'),
  self.arr = ko.observableArray(['item1']),
  self.third = ko.computed(function(){
    return self.arr().join();
  });
};
ko.applyBindings(new ViewModel());

关于javascript - knockout 可观察数组计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741246/

相关文章:

php - 计算php中每个子数组中的元素

ios - 如何在 Swift 中使用另一个数组中的元素过滤数组?

jquery - knockout JS : Stop divs binded to visible: from flashing on screen

javascript - 在Durandal中进行数据绑定(bind)后动态绑定(bind)外部html文件

Javascript数组存储过程

javascript - 创建工厂后看不到数据

javascript - 如何在jssor slider 中放置下拉菜单

javascript - jQuery 和 DataTables - 是否可以重新调用之前的 AJAX 命令?

arrays - 如何计算一组数字的 EMA?

javascript - 如何防止 knockout.js 数据绑定(bind)中的字符转义?