【问题标题】:CoffeeScript - simple loop doesn't execute as I think it shouldCoffeeScript - 简单的循环没有像我认为的那样执行
【发布时间】:2014-02-16 14:50:42
【问题描述】:

我对 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() 不起作用..返回的元素似乎没有“长度/大小”功能。

【问题讨论】:

    标签: javascript jquery html coffeescript


    【解决方案1】:

    您的dos 缺少一些东西:循环值作为参数。

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

    for i in a
      do -> ...
    

    没有太多作用,因为 do 的函数仍将共享相同的 i 变量,就像这个 JavaScript 所做的那样:

    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) -&gt; 版本在调用函数时如何强制评估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)
    

    【讨论】:

    • 感谢您的快速回复和完整的解释 -
    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 2019-01-19
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2023-03-06
    相关资源
    最近更新 更多