Функция обратного вызова с параметрами - PullRequest
3 голосов
/ 04 января 2011

Я использую методы страницы AJAX, но не могу передать необходимые параметры:

  function getFavStatus() {
    //favs is a list of DOM <imgs> that I want to modify their img.src attribute
    for (i = 0; i < favs.length; i++) {
      PageMethods.isFavorite(favs[i].alt,setFavImg(favs[i]));
    }
  }

  function setFavImg(fav, response) {
    fav.src = response;
  }

Проблема, которую я не могу понять, заключается в том, как использовать «ответ» от PageMethods И передать объект DOM в функцию обратного вызова.

Я также пытался сделать что-то вроде этого:

 function getFavStatus() {
    for (i = 0; i < favs.length; i++) {
      PageMethods.isFavorite(favs[i].alt, function (response) {
                favs[i].src = response;});   
      );
    }
  }

В этом случае ответ работает должным образом, но i всегда равен > favs.length, поскольку он уже повторялся в цикле ...

Редактировать : Моя PageMethods.is Любимая подпись:

[System.Web.Services.WebMethod]
public static string isFavorite ( string p_id )

Кто-нибудь может указать мне правильное направление?

Спасибо!

Ответы [ 3 ]

1 голос
/ 04 января 2011

Вот еще одна идея, которая сэкономит массу хлопот, хотя и не очень элегантна.

Пусть метод page возвращает две строки (т.е. массив с двумя строковыми элементами) - первую строкубудет идентификатором элемента изображения, а второй будет желаемым источником.

Тогда функция обратного вызова станет:

function (response) {
    document.getElementById(response[0]).src = response[1];
}
1 голос
/ 04 января 2011

Ответ Брайана, вероятно, является самым чистым способом сделать это, но альтернативой (если параметр ctx не поддерживаются), которая решает проблему всегда стоящего конца цикла i, является использование замыканиячтобы сохранить значение i:

function createCallback(i) {
    return function (response) {
        favs[i].src = response;
    }
}

function getFavStatus() {
    for (i = 0; i < favs.length; i++) {
      PageMethods.isFavorite(favs[i].alt, createCallback(i));   
    }
  }
1 голос
/ 04 января 2011

Попробуйте это:

PageMethods.isFavorite(favs[i].alt, 
  function (response, ctx) {
       /* success callback */
       ctx.src = response;
  },
  function(response) { /* failed callback */ },
  favs[i] /* context */);

Контекст передается обратным вызовам, поэтому вы можете передать ссылку на изображение обратным вызовам и установить ее в обратном вызове.

Первоначальная проблема заключается в том, что методы страницы являются асинхронными, поэтому обратный вызов не запускается до тех пор, пока цикл не завершится.Отсюда и последний затронутый предмет.

HTH.

...