2016-12-01 1 views
1

아약스 게시물을 사용하여 부분 뷰에 전달할 알 수없는 양의 개체가 있습니다. 부분 뷰는 각 부분 뷰에서 원하는대로 데이터를 표시하는 기본 테이블 일뿐입니다. 내가 잘 할 수있는, 문제는, 내가 각 부분보기를 개별 div 요소 안에 넣고 싶습니다. 드래그 앤 드롭을 통합하고 싶기 때문에 드롭의 div ID를 알아야 할 필요가 있다고 생각합니까? (내가 틀렸다면 나를 바로 잡아라.).when.apply()를 사용하여 지연 jquery 아약스 요청 인덱스 검색

즉, 먼저 div를 동적으로 만들고 해당 ID에 루프 .each()을 추가하고 ID 번호를 증가시켜야합니다. 여기에 .append() 함수를 사용해야한다는 것을 알고 div를 완벽하게 만들고 올바르게 이름을 지정합니다.

이제 div 요소 각각에 대해 부분보기 동작에 대해 ajax 게시 요청을 수행하고 html을 부분보기 응답으로 변경하려고합니다. 나는 아약스 호출이 비동기식이라는 사실을 깨닫는다. 그 이유는 처음에는 마지막 div 만 업데이트했기 때문에 모든 요청을 배열에 넣고 .when.apply().then()을 사용하여 div의 html을 변경했다. 그러나 나는 변화시킬 div의 이드를 모른다. 나는 내가 사용할 수있는 배열에서 현재 항목의 색인을 얻을 수 있다면 그것을 얻는 방법을 모르겠다 고 생각했다.

누구든지 내 코드를보고 내가 이것을 복잡하게 만들었는지 아니면 내가 HTML을 설정해야하는 div의 색인을 얻을 수 있는지 말해 줄 수 있습니까?

<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> 

편집 이전 시도 결과는 코드의

<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 요청에 대한 작업을 수행하려면 : 대신 .each/push 루프의 약속의 배열에 요소의 배열을 변환하는 Array.prototype.map 사용을 고려 . 그런 다음 각 응답에 대해'div' 내에 중첩 된 필수'table'을 생성 할 수 있습니다. –

+0

나는 그걸 시도했지만 아무 div도 업데이트하지 않았다. 나는 그들이 완료하고 경보가 나타 났지만 div의 아무도 바뀌지 않았을 때 알려주는 경고를 사용했습니다. 그래서'.then()'함수에서 div html을 변경하는 코드를 넣었습니다. 이제 마지막 부분은 바뀌지 만 다른 부분은 바뀌지 않습니다. 왜냐하면'divid'는 생성 된 최종 div의 id이기 때문입니다. –

+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'); 
    }); 
}); 

추신 각`$ .ajax` 호출 내에서`success` 핸들러 함수를 추가

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

그러면 배열의 인덱스를 사용하여 'divid'를 동일하게 만드는 순서가 추가됩니까? 처음에 div를 만들기 위해 내 모델 데이터를 반복 할 때'$ .each'가 필요하다고 가정합니다.어떻게 Array.prototype.map을 찾아 봐야 도움이 될지 알아보아야 할 것입니다. –

+0

당신은'div' 생성을 연기하고 대신 여기'.forEach' 호출 안에 놓을 수 있습니다 - 그에 따라 업데이트 할 것입니다 (그렇습니다. 배열의 인덱스가 끝나서 구분선이 동일하게됩니다) – Alnitak

+0

Ahhh Array.map이 지금 수행합니다. 배열의 각 항목에 대해 함수를 실행합니다. 고마워. –

1

두 번째 많은 작업에 가까운 마지막 DIV 요소를 overwritting 유지한다는 것이다. 성공할 때 배당금의 가치를 유지하기 위해 IIFE에 Ajax 콜 코드를 래핑해야했습니다. 이 경우에는 약속이 필요하지 않습니다.

예 : 이 같은 :

$(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'는 이미 클로저에 바인딩되어 있으므로 콜백 내에'divid = 'header'+ i'의 계산을 넣고 IIFE는 사용하지 않는 것이 가장 간단합니다. – Alnitak

+0

Brilliant! 전에 IIFE에 대해 들어 본 적이 없었습니다! (New to web/jquery) 코드의 대괄호는 나에게 약간의 엉덩이를 주었지만 결국 그것을 분류했습니다. 소스에서 div 요소를 찾을 수 없지만 내 드롭 함수를 빌드하려고 할 때 이유를 알아낼 것입니다! 다시 한 번 감사드립니다! (또한 DOM의 바로 가기에 대한 준비에 감사드립니다!) –

+0

@HollyMarieBatchelor IIFE는 완전히 불필요합니다 (단 하나의 사소한 코드 행을 반복하지 않아도 됨). 또는 콜백 내부까지'header' div를 만드는 것을 연기하십시오. – Alnitak