Javascript knockout.js:在Array上没有concat

Javascript knockout.js:在Array上没有concat,javascript,knockout.js,Javascript,Knockout.js,仅从knockout.js开始,但在尝试基于两个不同的observatarrays创建computed方法时遇到了一些问题 使用knockout.js网站上的文档,我创建了以下viewmodel: var Cart = function() { var self = this; self.Products = ko.observableArray([]); self.Products2 = ko.observableArray([]); self.Messages = ko.o

仅从knockout.js开始,但在尝试基于两个不同的
observatarray
s创建
computed
方法时遇到了一些问题

使用knockout.js网站上的文档,我创建了以下viewmodel:

var Cart = function() {
  var self = this;

  self.Products = ko.observableArray([]);
  self.Products2 = ko.observableArray([]);
  self.Messages = ko.observableArray([]);

  self.TotalAmount = ko.computed(function() {
    var result = 0;
    ko.utils.arrayForEach(
      this.Products().concat(this.Products2()),
      function(item) {
        result+=item.AmountIncludingVAT();
      }
    );
    return result;
  });
};
执行此操作将抛出一个错误
“uncaughttypeerror:Object#没有方法“concat”

我知道有一个函数叫做
arrayPushAll
,但它是一个破坏性函数,会改变原来的
ObservalArray
(我不认为这是我想要的)

是否有任何干净的方法来实现我想要做的事情?或者我必须对每个数组进行两次不同的调用,每个数组调用一次?

更改:

this.Products().concat(this.Products2()),
致:

在TotalAmount ko.computed函数中

this
在计算的上下文中指的是全局对象,而不是视图模型。因此,您需要使用先前分配了正确的
this
值的
self
变量


工作示例-

concat
对我不起作用..我做了
push

self.Products.push.apply( 
  self.Products, self.Products2()
);

您的代码还存在其他问题。尽管
observableArray
没有
concat
方法,但数组有。使用
this.Products()
您正在展开可观察对象并处理数组。因此,请创建一个显示此错误的工作JSFIDLE!除了接受的答案外,concat函数不会更改现有数组,它在执行串联后返回一个新数组。您将丢弃实际包含合并数组的返回值N链接:如果可以使用spread,那么self.Products.push(…self.Products2())也可以使用
self.Products.push.apply( 
  self.Products, self.Products2()
);