使用 .when.apply() 检索延迟的 jquery ajax 请求的索引

Retrieving the index of deferred jquery ajax request using .when.apply()

我有一个对象列表,我想使用 ajax posts 传递给部分视图的对象数量未知。局部视图只是一个基本的 table,它在每个局部视图中显示我希望的数据。我可以做到这一点,问题是,我希望每个部分视图都在 dividual div 元素中,因为我想合并拖放,我认为为此我需要知道 drop 的 div id 吗? (如果我在这里错了,请纠正我)。

这意味着我需要首先动态创建 div 并使用循环 .each() 为它们分配 ID,并递增 ID 号。我知道我需要在这里使用 .append() 函数,它完美地创建了 divs,并正确命名它们。

现在的问题是我希望对创建的每个 div 元素执行 ajax post 对我的部分视图操作的请求,并且我想更改 html 到局部视图响应。我意识到 ajax 调用是异步的,这就是为什么一开始只有最后一个 div 正在更新所以我将所有请求放在一个数组中并使用 .when.apply().then() 来更改 div 的 html。但是我不知道要更改的 div 的 id;我想,如果我能得到数组中当前项目的索引,我就可以使用它,但我不确定如何得到它。

有人可以看看我的代码并告诉我我是否过于复杂,或者我如何获得 div 的索引我需要为 html 设置?

    <script type="text/javascript">
    $(document).ready(function () {
        var modelData = [@Html.Raw(Json.Encode(Model.mappings))][0];
        var divid;
        var ajaxrequests = [];
        $.each(modelData, function (i, item) {
            divid = 'header' + i;
            $('#HeaderData').append('<div id="' + divid + '">Hello</div>');
            ajaxrequests.push($.ajax({
                url: "HeaderFieldMapping",
                type: "POST",
                data: JSON.stringify(item),
                contentType: "application/json; charset=utf-8",
                dataType: "html"
            }));
        });
        $.when.apply($, ajaxrequests).then(function (resultdata) {
            divid = 'header' + [index???];
            $('#' + divid).html(resultdata);
        });
    });
</script>

编辑了之前的尝试 结果是它不断覆盖最后一个 div 元素

    <script type="text/javascript">
    function rowDropHandler(args) {
        var item = args.data[0];
        alert(item);
    }
    $(document).ready(function () {
        var modelData = [@Html.Raw(Json.Encode(Model.mappings))][0];
        var divid;
        var ajaxrequests = [];
        var intnum = 0;
        $.each(modelData, function (i, item) {
            divid = 'header' + i;
            $('#HeaderData').append('<div id="' + divid + '">Hello</div>');
            ajaxrequests.push($.ajax({
                url: "HeaderFieldMapping",
                type: "POST",
                data: JSON.stringify(item),
                contentType: "application/json; charset=utf-8",
                dataType: "html",
                success: function(resultdata){
                    $('#' + divid).html(resultdata);
            }
            }));
        });
        $.when.apply($, ajaxrequests).then(function (resultdata) {
            alert('done' + resultdata);
        });
    });
</script>

你的第二批代码更接近于工作了。您只需要将 Ajax 调用代码包装在一个 IIFE 中,以便在成功触发时保持 divid 的值。在这种情况下您不需要承诺:

例如像这样:

$(function() {  // <<< Shortcut for DOM ready handler
  var modelData = [@Html.Raw(Json.Encode(Model.mappings))][0];
  var divid;
  var intnum = 0;
  $.each(modelData, function(i, item) {
    divid = 'header' + i;
    $('#HeaderData').append('<div id="' + divid + '">Hello</div>');
    (function(divid) {
      $.ajax({
          url: "HeaderFieldMapping",
          type: "POST",
          data: JSON.stringify(item),
          contentType: "application/json; charset=utf-8",
          dataType: "html",
          success: function(resultdata) {
            $('#' + divid).html(resultdata);
          }
        )
      }(divid);
    });
  });
});

在您的第一个基于 $.when 的版本中,您将在 arguments 伪数组中为每个承诺获得一个单独的条目。这些条目中的每一个依次都是 success 处理程序的三个标准参数的数组。

因此您可以简单地遍历该数组并填写您的 HTML:

$.when.apply($, ajaxrequests).then(function() {
    [].forEach.call(arguments, function(result, index) {
        var divid = 'header' + index;
        var resultdata = result[0];
        $('<div>', {id: divid, html: resultdata}).appendTo('#HeaderData');
    });
});

p.s。考虑使用 Array.prototype.map 将元素数组转换为承诺数组而不是 .each / push 循环:

var ajaxrequests = modelData.map(function(item, index) { // NB: index unused
    return $.ajax({
        url: "HeaderFieldMapping",
        type: "POST",
        data: JSON.stringify(item),
        contentType: "application/json; charset=utf-8",
        dataType: "html"
    });
});