JQuery: я не могу установить значение в цикле с динамическим значением - PullRequest
3 голосов
/ 15 июня 2011

Как получается в следующем коде, моя бизнес-функция обновления всегда обновляет ввод с окончательным значением в массиве

for (var i = 0; i < results.length; i++) {
var place = results[i];
var input = $("<input/>").change(function(){update_business(place.name)});

...

}

function update_business(value){

$('#business input').val(value);                                
}

Ответы [ 3 ]

2 голосов
/ 15 июня 2011

Проблема здесь в том, что все эти функции-обработчики событий будут использовать одну и ту же переменную "place";Здесь только один.Относительно обработчиков событий это как глобальная переменная.

Вы можете написать отдельную функцию, чтобы помочь:

  function makeHandler(place) {
     return function() {
       update_business(place.name);
     };
   }

Затем вы можете вызвать ее в цикле:

 var input = $('<input/>').change(makeHandler(place));

Функция возвращает другую функцию, которая будет фактически использоваться в качестве обработчика событий.Поскольку переменная «place» из цикла передается в качестве аргумента функции «makeHandler», это уникальная копия «place» на определенной итерации цикла.Таким образом, у каждого обработчика событий есть свое собственное «место».

1 голос
/ 15 июня 2011

Ваша внутренняя функция имеет замыкание на саму внешнюю переменную, не копия ее значения.

Вам нужно передать ее по значению, не используя закрытую переменную over, ановый из тех, чья продолжительность жизни является более короткой.

(function(j) {
    var place = results[j];
    ...
})(i);

Здесь значение i передается самопризывающей анонимной функции в качестве аргумента j, и j всегда будет тем, чем iбыл во время вызова этой функции.

0 голосов
/ 15 июня 2011

.val () заменит значение вместо добавления значения.попробуйте использовать .append, если вы хотите добавить к вашему текущему значению.

...