Я слишком новичок в 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 "У меня есть функция" длина/размер ".
В вашем деле 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)