Angularjs 角度`$watchCollection`在测试中返回未定义的oldVal

Angularjs 角度`$watchCollection`在测试中返回未定义的oldVal,angularjs,jasmine,Angularjs,Jasmine,我正在根据标记编译的指令运行Jasmine规范 在指令中使用以下方法: scope.$watchCollection 'x', -> console.log arguments 以及以下测试: it "adds to array", -> scope.$apply( -> scope.x = [] ) scope.$apply( -> scope.x.push(0) ) 我得到以下控制台输出: [undefined, unde

我正在根据标记编译的指令运行Jasmine规范

在指令中使用以下方法:

 scope.$watchCollection 'x', ->
    console.log arguments
以及以下测试:

it "adds to array", ->
  scope.$apply( ->
    scope.x = []
  )
  scope.$apply( ->
    scope.x.push(0)
  )
我得到以下控制台输出:

[undefined, undefined, Scope]
jasmine-specs.js:63717 [Array[0], undefined, Scope]
jasmine-specs.js:63717 [Array[1], undefined, Scope]

这个好像坏了。我希望最后一行的第二个参数是“Array[0]”,即集合的前一个值。为什么不会呢?

我能够复制同样的东西,我也很困惑,直到我在下面的文章中看到这一点:

oldCollection
对象是以前收集数据的副本。出于性能考虑,仅当
侦听器
函数声明两个或多个参数时,
才计算ldcollection

本声明指的是本规范:

$scope.$watchCollection('x', function() {
    console.log(arguments);
});
与此相比:

$scope.$watchCollection('x', function(newVal, oldVal) {
    console.log(arguments);
});
(我知道这不是使用lambda语法,但它是相同的解决方案)

因此,
oldCollection
将始终是未定义的,除非您实际声明了第一个和第二个参数来保存新值和旧值。然后它将显示为
数组[0]
,正如您所期望的那样。这将表明这一点


编辑:我认为其他语法应该是:

scope.$watchCollection 'x', (new, old) ->
    console.log arguments

那不是有点打字错误吗?参数应该是
(newVal,oldVal)