我在从标记编译的指令上运行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]",该集合的前一个值。为什么不这样呢?
答案 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