2016-12-01 7 views
1

У меня есть список объектов, количество неизвестных которых я бы хотел передать частичным представлениям с помощью сообщений ajax. Частичный вид - это просто базовая таблица, которая отображает данные, как я желаю в каждом частичном представлении. Я могу сделать это хорошо, проблема в том, что я хотел бы, чтобы каждое частичное представление находилось внутри отдельных элементов div, потому что я хочу включить перетаскивание, и я думаю, что для этого мне нужно знать div id падения? (Исправьте меня, если я ошибаюсь здесь).Извлечение индекса отложенного запроса ajax jquery с использованием .when.apply()

Это означает, что мне нужно сначала динамически создавать divs и назначать им их идентификаторы, используя цикл .each() и увеличивая число id. Я знаю, что мне нужно использовать функцию .append() здесь, и она отлично создает divs, называя их правильно.

Теперь проблема заключается в том, что я хочу выполнить запрос ajax для моего частичного действия просмотра для каждого из созданных элементов div, и я хочу изменить html на ответ частичного представления. Я понимаю, что вызовы ajax являются асинхронными, поэтому сначала обновлялся только последний div, поэтому я помещал все запросы в массив и использовал .when.apply().then() для изменения html div. Однако я не знаю, как id div должен измениться; Я думал, что если бы я мог получить индекс текущего элемента в массиве, который мог бы использовать это, но я не уверен, как его получить.

Может кто-нибудь, пожалуйста, посмотрите на мой код и скажите мне, не слишком ли я это затрудняюсь или как я могу получить индекс 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> 

Отредактированных предыдущая попытка Результата является то, что он держит overwritting последнего элемента 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> 
+0

Чтобы сделать работу на индивидуальные запросы AJAX, добавьте 'success' функции обработчика внутри каждого' $ .ajax' вызова , Затем вы можете создать требуемую «таблицу», вложенную в 'div' для каждого ответа. –

+0

Я пробовал это, но ни один из divs не обновлялся. Я использовал оповещение, чтобы сообщить мне, когда они закончили, и предупредил, но ни один из divs не изменился. Вот почему я поместил код для изменения div html в функцию '.then()'. Теперь последний будет изменен, но ни один из других, потому что 'div' - это идентификатор последнего div, созданного. –

+0

Не могли бы вы обновить вопрос, чтобы показать, что вы пробовали в этом случае. Обратите внимание, что если вы используете '.html()', то каждый последующий запрос будет перезаписывать предыдущий. 'append()' было бы более уместным в этом случае. –

ответ

2

В вашей первой $.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" 
    }); 
}); 
+0

Итак, это с помощью индекса массива, чтобы получить порядок, в котором они были добавлены, что сделает «деление» одинаковым? Я предполагаю, что мне все равно понадобится '$ .each', чтобы прокрутить мои данные модели, чтобы создать divs в первую очередь?Мне нужно будет найти «Array.prototype.map», чтобы посмотреть, как это поможет мне. –

+0

Вы можете отложить создание 'div' и отбросить его внутри вызова' .forEach' здесь - я буду обновлять соответственно (и да, индекс массива заканчивается тем, что деление одинаково) – Alnitak

+0

Ahhh Я вижу, что Теперь Array.map делает. Он выполняет функцию для каждого элемента массива. Спасибо за это. –

1

Ваших вторые много кода ближе к работе. вам просто нужно было обернуть код вызова Ajax в IIFE, чтобы сохранить значение деления при успешном запуске. Вам не нужны обещания в этом случае:

например. что-то вроде этого:

$(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); 
    }); 
    }); 
}); 
+0

это излишне сложно - переменная 'i' уже привязана к замыканию, поэтому самым простым решением было бы провести вычисление' div = 'header' + i' внутри обратного вызова и не использовать IIFE. – Alnitak

+0

Блестящий! Раньше я никогда не слышал об ИИИФ! (Новое для web/jquery) Скобки в вашем коде дали мне немного jip, но в конечном итоге отсортировали его. Я не могу найти элементы div в источнике, но я пойму, почему, когда я пытаюсь построить свою функцию drop! Еще раз спасибо! (Также спасибо за ярлык для DOM!) –

+0

@HollyMarieBatchelor IIFE совершенно не нужен (хотя это позволяет избежать повторения одной тривиальной строки кода). Альтернативно отложить создание разделов 'header' до тех пор, пока внутри обратного вызова тоже не будет. – Alnitak