2016-12-01 15 views
1

私は、ajax投稿を使用して部分的なビューに渡したい不明な量のオブジェクトのリストを持っています。パーシャルビューは、各パーシャルビューでどのようにデータを表示するかを示す基本的なテーブルです。私はこれをうまくやることができます。問題は、ドラッグ&ドロップを取り入れたいので、個々のdiv要素の中に各部分的なビューを入れることです。ドロップのdiv idを知る必要があるでしょうか? (私がここに間違っているなら私を訂正してください)。.when.apply()を使用した遅延jquery ajaxリクエストのインデックスの取得

これは、最初にdivを動的に作成し、ループID番号をインクリメントしてループ.each()を使用してIDを割り当てる必要があることを意味します。私はここで.append()関数を使用する必要があることを知っており、divを完全に作成して正しく名前を付けます。

ここで問題は、作成されたdiv要素ごとに部分表示操作にajax投稿要求を実行し、部分ビュー応答にhtmlを変更することです。私は、ajax呼び出しは非同期であることに気付きました。最初は最後のdivのみが更新されていましたので、すべての要求を配列に入れ、divのhtmlを変更するのに.when.apply().then()を使用しました。しかし私は変更するdivのidを知らない。私はそれを使用することができる配列の現在の項目のインデックスを得ることができればそれを得る方法がわからないと思った。

誰かが私のコードを見て、私がこれを過度に複雑にしているかどうか、または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'呼び出し内で' SUCCESS'ハンドラ関数を追加。それぞれのレスポンスに対して 'div'の中にネストされた必要な' table'を作成することができます。 –

+0

私はそれを試みたが、divのどれも更新していなかった。私は、アラートを使用して、完了したときに通知し、アラートは表示されましたが、divの変更はありませんでした。そのため、 '.then()'関数でdiv htmlを変更するコードを書いています。最後のものは変更されますが、 'divid'は作成された最終divのidなので、他のものは変更されません。 –

+0

その場合に試したことを示すために質問を更新できますか? '.html()'を使うと、連続する各要求は前のものを上書きすることに注意してください。その場合、 'append()'がより適切でしょう。 –

答えて

2

、あなたは一人ひとりの約束のためのarguments擬似配列の個別のエントリを取得します。これらのエントリのそれぞれは、successハンドラの3つの標準パラメータの配列になります。

は、したがって、あなたは、単にその配列を反復して、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.代わりに.each/pushループの約束の配列に要素のあなたの配列を変換するArray.prototype.mapを使用することを検討してください:個々のAJAX要求に作業を行うために

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

これは、配列のインデックスを使って、それらが追加された順序を取得して、 '分割'を同じにするでしょうか?最初にdivを作成するために私のモデルデータをループするのに '$ .each'が必要だと思いますか?私は 'Array.prototype.map'を調べて、それがどのように私を助けてくれるのか見る必要があります。 –

+0

'div'の作成を延期し、代わりに' .forEach'コールの中にドロップすることができます - それに応じて更新します(そして、配列のインデックスが終了して同じようになります) – Alnitak

+0

ああ、 Array.mapは今行う。配列内の各項目に対して関数を実行します。ありがとうございました。 –

1

最後のdiv要素をoverwrittingコードのあなたの第2のロットは作業に近いです。成功が発生したときに、分割の価値を維持するために、AFEのコール・コードをIIFEでラップするだけで済みました。この場合、約束は必要ありません。

このような何か:あなたの最初の$.whenベースのバージョンで

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

ブリリアント!私は前にIIFEについて聞いたことがなかった! (New to web/jquery)あなたのコードの角括弧は私にいくつかのジップを与えましたが、最終的にそれを並べ替えました。ソースでdiv要素を見つけることができませんが、私がドロップ機能を構築しようとすると、なぜ私は理解します!再度、感謝します! (DOMの準備のためのショートカットもありがとう!) –

+0

@HollyMarieBatchelor IIFEは完全に不要です(ただし、簡単なコード行の繰り返しは避けます)。あるいは、コールバックの中に入るまで、 'header' divの作成を延期してください。 – Alnitak

関連する問題