JavaScript[Konva]: 仅排列多个事件 return 最后一个对象
JavaScript[Konva]: arrayed multiple events only return the last object
当多个Transformer
对象存储在数组中时,on()
事件仅returns最后一个对象transAry
(transAry[transAry.length-1]
).
for (var i = 0; i < transAry.length; i++){
var trans = transAry[i];
trans.on('transformer dragmove', function(){
console.log(trans.x(), trans.y(), trans.scaleX(), trans.scaleY());
});
}
在这种情况下,当通过鼠标操作移动或调整每个 Transformer
对象时,console.log
仅显示 transAry
(transAry[transAry.length-1]
) 的最后一个对象。
我想触发数组Transformer
对象的所有事件,但我不知道该怎么做。
好像不是Konva.js特有的问题,但我猜是因为我不明白JavaScript异步处理是如何正常工作的.
我认为,当你使用 var 时,on() 是一个回调函数,所以当 on() 运行 时,for 循环结束并且变量 trans = 数组中的最后一个元素
=> console.log 总是 return 数组中的最后一个元素
我想解决这个问题,你可以使用 let 而不是 var
for (var i = 0; i < transAry.length; i++){
(function(cnt){
var trans = transAry[cnt];
trans.on('transformer dragmove', function(){
console.log(trans.x(), trans.y(), trans.scaleX(), trans.scaleY());
});
})(i);
}
这是给自己的备忘录。
事实证明,将回调函数限制在立即函数内也可以达到同样的效果。
cnt
的范围仅限于立即函数。
当多个Transformer
对象存储在数组中时,on()
事件仅returns最后一个对象transAry
(transAry[transAry.length-1]
).
for (var i = 0; i < transAry.length; i++){
var trans = transAry[i];
trans.on('transformer dragmove', function(){
console.log(trans.x(), trans.y(), trans.scaleX(), trans.scaleY());
});
}
在这种情况下,当通过鼠标操作移动或调整每个 Transformer
对象时,console.log
仅显示 transAry
(transAry[transAry.length-1]
) 的最后一个对象。
我想触发数组Transformer
对象的所有事件,但我不知道该怎么做。
好像不是Konva.js特有的问题,但我猜是因为我不明白JavaScript异步处理是如何正常工作的.
我认为,当你使用 var 时,on() 是一个回调函数,所以当 on() 运行 时,for 循环结束并且变量 trans = 数组中的最后一个元素 => console.log 总是 return 数组中的最后一个元素
我想解决这个问题,你可以使用 let 而不是 var
for (var i = 0; i < transAry.length; i++){
(function(cnt){
var trans = transAry[cnt];
trans.on('transformer dragmove', function(){
console.log(trans.x(), trans.y(), trans.scaleX(), trans.scaleY());
});
})(i);
}
这是给自己的备忘录。
事实证明,将回调函数限制在立即函数内也可以达到同样的效果。
cnt
的范围仅限于立即函数。