2016-12-21 35 views
1

此答案提供了一个有用的解释,说明如何将“链接”(实际上是重定向到URL的事件)添加到特定对象而不是画布上的所有对象:防止在由fabric.js调用的函数中进行惰性评估

How to add URL to an image in Fabric.js?

然而,放置,生成多个对象在一个循环内时,它只链接到创建的值的最后一个对象。

下面是一个例子:

for (var p = 0; p<2; p++) { 
    var object = new fabric.Circle({ radius: 10, top: 10 + 20 * p, left: 10 }); 
    object.on('selected', function() { 
    window.location.href = "mylink" + "/" + p; 
    }) 
    canvas.add(object); 
} 

这将有两个对象链接到“myLink的/ 1”的时候,我要的是第一个对象链接到“myLink的/ 0”,第二个链接到“mylink/1”。

我的JavaScript技能卡在1999年,但这看起来像一个懒惰的加载问题给我。我如何强制从每个循环创建的对象具有自己的功能?

回答

1

它似乎是关于懒惰评估/关闭。

使用这个美丽的答案(Javascript: Creating Functions in a For Loop),我能够制定一个解决方案。在这里寄出希望对别人有用。查看链接的答案为什么它的作品。

var fxnArr = []; 
    for(var p = 0; p < rows.length; p++) { 
    fxnArr[fxnArr.length] = (function(val) { return function(){ 
     window.location.href = "mylink" + "/" + val; 
    } })(p); 
    } 
    for (var p = 0; p<2; p++) { 
    var object = new fabric.Circle({ radius: 10, top: 10 + 20 * p, left: 10 }); 
    object.on('selected', fxnArr[p]); 
    canvas.add(object); 
    } 
+1

一个更简单的解决方法是使用'让p'而不是'无功p' - 通过互联网爆炸物和瞧 –

+1

@JaromandaX一个transpiler运行它 - 是的。现在,ES6在任何地方都能得到支持,使用'let'是最好的选择。正如[这Mozilla黑客帖子](https://hacks.mozilla.org/2015/07/es6-in-depth-let-and-const/)解释:“形式循环for(let x ... )'在每次迭代中为'x'创建一个新的绑定。“ –

+0

有帮助。谢谢! –