CoffeeScript - простой цикл не выполняется так, как мне кажется

0

Я слишком новичок в 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() не работает.. кажется, что возвращаемый элемент doesn "У меня есть функция" длина/размер ".

Теги:
coffeescript

1 ответ

1
Лучший ответ

В вашем деле do то отсутствует: значения цикла в качестве аргументов.

Функция обертка, что do обеспечивает в чем - то вроде этого:

for i in a
  do -> ...

не делает многого, поскольку функция do все равно будет использовать одну i ту же переменную 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) -> версия заставляет 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)
  • 0
    Спасибо за быстрый ответ и полное объяснение -

Ещё вопросы

Сообщество Overcoder
Наверх
Меню