只有For-of-Loop的最后一个值被传递给JQuery click函数

时间:2013-02-11 22:16:46

标签: jquery coffeescript closures

我在CoffeeScript中有以下For Of循环,循环遍历对象的属性:

for buildingFrame of buildingNames
  $("#bt-#{buildingFrame}").click () => @displayProperties(buildingFrame)

似乎只有buildingFrame的最后一个值传递给@displayProperties的每次调用。搜索网站后,我发现了我认为的原因:Possible Answer

之所以只使用循环中的最后一个值,是因为JavaScript是一种后期绑定语言,而循环不会引入新的范围。修复此问题的解决方案在JavaScript的答案中给出如下:

for(var i=0; i<barValues.length; i++) function(i){
  ...
}(i);

我已尝试将此解决方案用于上面的coffeScript,尝试解决问题:

for buildingFrame of buildingNames => (buildingFrame)
  $("#bt-#{buildingFrame}").click () => @displayProperties(buildingFrame)
(buildingFrame)

但这只是我的编译器错误。有人请告诉我如何在CS中解决这个问题。谢谢大家!

2 个答案:

答案 0 :(得分:2)

这样的事情怎么样?

for buildingFrame of buildingNames
  do (buildingFrame) =>
    $("#bt-#{buildingFrame}").click => @displayProperties(buildingFrame)

这将编译成以下JavaScript:

_fn = function(buildingFrame) {
  return $("#bt-" + buildingFrame).click(function() {
    return _this.displayProperties(buildingFrame);
  });
};

for (buildingFrame in buildingNames) {
  _fn(buildingFrame);
}

答案 1 :(得分:1)

您可以使用do关键字:

for buildingFrame in buildingNames
    do (buildingFrame) ->
        $("#bt-#{buildingFrame}").click () => @displayProperties(buildingFrame)