3

我正在使用 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.isFavorite 签名是:

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

谁能指出我正确的方向?

谢谢!

4

3 回答 3

1

试试这个:

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

上下文被传递给回调,因此您可以将图像的引用传递给回调,并在回调中设置它。

最初的问题是页面方法是异步的,因此直到循环完成后才会触发回调。因此最后一项受到影响。

HTH。

于 2011-01-04T15:32:19.903 回答
1

这是另一个可以省去很多麻烦的想法,虽然它不是很优雅。

让页面方法返回两个字符串(即具有两个字符串项的数组)——第一个字符串将是图像元素的 ID,第二个将是所需的源。

那么回调函数会变成:

function (response) {
    document.getElementById(response[0]).src = response[1];
}
于 2011-01-04T15:58:48.377 回答
1

Brian 的回答可能是最干净的方法,但是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));   
    }
  }
于 2011-01-04T16:14:04.010 回答