20


11

インライン更新の成功/レコードのインライン作成が成功した後、jqgridがグリッドをリロードする

行のインライン編集後にreloadGridをトリガーする方法を知りたいのですが。

    jQuery(document).ready(function(){
      var lastcell;
      jQuery("#grid").jqGrid({
          url:'{{ json_data_handler }}?year={{ get_param_year }}&month={{ get_param_month }}&project_id={{ get_param_project_id }}',
          datatype: "json",
          mtype: 'GET',
          colNames:['hour_record_pk', 'project_pk', 'weekday', 'date', 'sum', 'description'],
          colModel:[
                    {name:'hour_record_pk',index:'hour_record_pk', width:55, sortable:false, editable:true, editoptions:{readonly:true,size:10}},
                    {name:'project_pk',index:'project_pk', width:55, sortable:false, editable:true, editoptions:{readonly:true,size:10}},
                    {name:'weekday',index:'weekday', width:300, editable:false, sortable:false},
                    {name:'date_str',index:'date_str', width:300, editable:true, sortable:false, editoptions:{readonly:true}},
                    {name:'sum',index:'sum', width:100, editable:true, sortable:true,editrules:{number:true,minValue:0,maxValue:24,required:true}},
                    {name:'description',index:'description', width:600, editable:true, sortable:false,},
               ],
         jsonReader : {
              repeatitems:false
         },
          rowNum:31,
          rowList:[10,20,31],
          //pager: jQuery('#gridpager'),
          sortname: 'id',
          viewrecords: true,
          sortorder: "asc",
          width: 800,
          height: 750,
          caption:"Hour Record Overview",
          reloadAfterEdit: true, //seems to have no effect
          reloadAfterSubmit: true, //seems to have no effect
          onSelectRow: function(id){
                if(id && id!==lastcell){
                    jQuery('#grid').jqGrid('restoreRow',lastcell);
                    jQuery('#grid').jqGrid('editRow',id,true);
                    lastcell=id;
                    }
                },
          editurl:"{% url set_hour_record_json_set %}"
     }).navGrid('#gridpager');
    });

function reload(result) {
    $("#grid").trigger("reloadGrid");
    }
</code></pre>

<p></p>

<p>I created already a reload method but I'm not sure where to put it in. I tried:</p>

<pre><code>jQuery('#grid').jqGrid('editRow',id,true,reload());
</code></pre>

<p>but this is already called when the user clicks into a row.
The code above allows the user to click into a row and when pressing enter the data is submitted and the record updated or created. </p>

<p>After the user created a new object I have to reload the grid, since I need the object id of the newly created object, in order to take care of further editing this row.</p>

<p>Edit: The solution:</p>

<pre><code>onSelectRow: function(row_id){
             if(row_id != null) {
                if(row_id !== last_selected_row) {
                    jQuery('#grid').jqGrid('restoreRow',last_selected_row);
                    jQuery('#grid').jqGrid('saveRow',row_id)
                           .editRow(row_id, true,false,reload);
                    last_selected_row = row_id;
                } else {
                    last_selected_row=row_id;
                }
              }
            },
</code></pre>

<p>Update: For future reference. All users starting with js grids might also have a look at <a href="https://github.com/mleibman/SlickGrid" rel="noreferrer">Slickgrid</a> as I switched from jqgrid to slickgrid and can only recommend it.</p>

5 Answer


38


editRow関数の構文は次のとおりです

jQuery("#grid_id").jqGrid('editRow', rowid, keys, oneditfunc, succesfunc, url, extraparam, aftersavefunc, errorfunc, afterrestorefunc);

_ _ * oneditfunc *:編集のために行に正常にアクセスした後、入力フィールドへのユーザーアクセスを許可する前に発生します。 行のIDは、パラメーターとしてこの関数に渡されます。

  • succesfunc *:定義されている場合、この関数はリクエストが成功した直後に呼び出されます。 この関数には、サーバーから返されたデータが渡されます。 サーバーからのデータに応じて。この関数はtrueまたはfalseを返す必要があります。

  • aftersavefunc *:定義されている場合、この関数はデータがサーバーに保存された後に呼び出されます。 この関数に渡されるパラメーターは、rowidとサーバー要求からの応答です。 _ _

あなたの場合、行が保存された後にグリッドを再読み込みしたい場合、editRowメソッドの呼び出しは次のようになります。

jQuery('#grid').jqGrid("editRow", id, true, '', '', '', '', reload)

'* aftersavefunc 'パラメータのグリッドをリロードする reload *関数を割り当てました

リロードメソッド自体は次のように定義する必要があります

function reload(rowid, result) {
  $("#grid").trigger("reloadGrid");
}


3


これを試して

      $("#grid").jqGrid('editRow', rowid, true, null, null, null, {}, aftersavefunc);

//

        function aftersavefunc(rowid, result) {
        $("#grid").trigger("reloadGrid");
    }


//


0


saveRowメソッドをご覧ください。

_ saveRow(rowid、succesfunc、url、extraparam、aftersavefunc、onerrorfunc) _

これは、リクエストが正常に完了したときとデータが保存された後に呼び出される2つのコールバック(successfuncs、aftersavefunc)を定義します。


0


ドキュメントから、私は afterSaveCell`があなたにとって最適に機能すると思います( afterSubmitCell`も同様に機能しますが、特定の戻り値が必要なようです。 サーバーのヒットが発生する前に「afterEditCell」が発生するため、すぐに実行されます。

jQuery('#grid').jqGrid('editRow', id, true, reload);

jQuery(document).ready(function(){
    var lastcell;
   jQuery("#grid").jqGrid({

      // [snip earlier config]

      onSelectRow: function(id){
            if(id && id!==lastcell){
                jQuery('#grid').jqGrid('restoreRow',lastcell);
                jQuery('#grid').jqGrid('editRow',id,true);
                lastcell=id;
                }
            },
      editurl:"{% url set_hour_record_json_set %}",
      onAfterSaveCell: reload
   }).navGrid('#gridpager');
});

function reload(result) {
    $("#grid").trigger("reloadGrid");
}

ただし、これまでに説明した情報を考えると、グリッド全体の再読み込みはおそらくやり過ぎです。 送信された情報をサーバー側で処理しない限り(保存後にデータベース内のデータが異なる可能性があることを意味します)、単純な編集後の再読み込みは時間の無駄のように思えます。

新しい行を作成するときは、サーバー側のみのデータ変更がない限り、サブミットから新しいIDを取得し、jqGridで個別に変更する方が簡単だと思われます。 ただし、最終的にはテーブル全体をリロードするのにかかる時間に大きく依存します。


0


Ок、少なくとも私のために働くコピーアンドペーストソリューション

 onSelectRow: function(id){
    $('#grid').jqGrid("editRow", id, true, '', '', '', '', reloadTable);
 },
 // more confir

 // reload table after submit. Put it somewhere in your JS file
  function reloadTable(result) {
    $('#grid').trigger("reloadGrid");
  }