CoffeeScript - 简单循环不会像我认为的那样执行

时间:2014-02-16 05:34:50

标签: javascript jquery html coffeescript

我在javascript上太新了..并且有一个简单的咖啡脚本问题。

脚本监视表单上的2个字段,如果其中任何一个发生更改,则更新第三个字段。 表单中有相同类型的“n”行。  这是代码

    line_pre = "#po_polines_attributes_"
    watched  = [ "_qty", "_unit_price"]
    UpdateTotal = (ln)  ->
        jQuery  ->
          e1 = line_pre + ln +  watched[0]·
          e2 = line_pre + ln +  watched[1]
          new_total = $(e1).val()*$(e2).val()
          res = line_pre + ln + "_total_price"
          $(res).val(new_total)
     #   
     for indx in [0, 1, 2]
        do  ->  
           for w_fld  in watched
              do ->
                jQuery ->
                   $(line_pre + indx + w_fld).focusout ->
                      UpdateTotal(indx)

代码运行但仅在更改qty或u_p时更新数据的最后一行。 我无法弄清楚原因。

另外..任何人都可以建议如何在jQuery / coffee中找到包含字符串的元素数量 $(“input [name~ ='search_str']”)。length()不起作用..看来返回的元素没有“length / size”函数。

1 个答案:

答案 0 :(得分:1)

您的do缺少某些内容:循环值为参数。

do提供的函数包装器,如下所示:

for i in a
  do -> ...

没有做太多,因为do的函数仍然会像JavaScript一样共享相同的i变量:

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

但是,如果do函数将i作为参数:

for i in a
  do (i) -> ...

然后一切都会改变,你开始做do打算做的事情:

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

请注意,在调用该函数时,do (i) ->版本如何强制i评估,以便您不再使用共享i

将此应用于循环会产生:

for indx in [0, 1, 2]
  do (indx) ->
    for w_fld  in watched
      do (w_fld) ->
        jQuery ->
          $(line_pre + indx + w_fld).focusout ->
            UpdateTotal(indx)