我正在从标记编译的指令上运行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]”,即集合的前一个值。为什么不是呢?
我能够重现同样的事情在这里,我很困惑过,直到我看到这个在为$ watchCollection角文档:
该
oldCollection
对象是以前的收集数据的副本。出于性能方面的考虑,theoldCollection
仅当listener
函数声明两个或多个参数时才计算value。
此语句引用此代码:
$scope.$watchCollection('x', function() {
console.log(arguments);
});
与这个:
$scope.$watchCollection('x', function(newVal, oldVal) {
console.log(arguments);
});
(我知道这没有使用lambda语法,但这是相同的解决方案)
因此,oldCollection
除非您实际声明第一个和第二个参数来保存新旧值,否则将始终未定义。然后,它将Array[0]
按预期显示。这个笨拙的人会证明这一点。
编辑:我认为其他语法将是:
scope.$watchCollection 'x', (new, old) ->
console.log arguments
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句