Angular` $ watchCollection`在测试中返回未定义的oldVal

时间:2016-05-21 01:49:49

标签: angularjs jasmine

我在从标记编译的指令上运行Jasmine规范。

在指令中使用以下方法:

if(string.IsNullOrEmpty(p))

以下测试:

 scope.$watchCollection 'x', ->
    console.log arguments

我得到以下控制台输出:

it "adds to array", ->
  scope.$apply( ->
    scope.x = []
  )
  scope.$apply( ->
    scope.x.push(0)
  )

这似乎破了。我希望最后一行的第二个参数是" Array [0]",该集合的前一个值。为什么不这样呢?

1 个答案:

答案 0 :(得分:3)

我能够重现同样的事情here,直到我在angular docs for $watchCollection中看到这一点时我才感到困惑:

  

oldCollection对象是以前的集合数据的副本。出于性能考虑,仅当theoldCollection函数声明两个或更多参数时,才会计算listener 值。

此声明指的是此代码:

$scope.$watchCollection('x', function() {
    console.log(arguments);
});

vs this:

$scope.$watchCollection('x', function(newVal, oldVal) {
    console.log(arguments);
});

(我知道这不是使用lambda语法,但它是相同的解决方案)

因此,除非您实际声明第一个和第二个参数以保存新值和旧值,否则oldCollection将始终未定义。然后它将显示为您预期的Array[0]。这个plunkr会显示出来。


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

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