web-dev-qa-db-ja.com

jqgridのデータの値を更新する方法

ロード時にjqgridのセルを永続的に更新しようとしています。私はsetCellを使用できることを知っていますが、そのページの値のみを更新します。ページに戻った場合、セルに対して別のsetCellを明示的に実行しないと、古い値が表示されます。私もsetRowDataを試しましたが、同じことをしているようです。私のアプローチは1)データをロードする2)いくつかの基準に基づいてデータのいくつかの値を変更する3)変更された値を表示するため、私はloadonceを使用しています。私はloadonceを使用しているので、このセッションでセルを永続的に変更する方法はありませんか?

更新:

エラーを出さないがすべてのデータを反復することに失敗する私のコードを入れます:

_var set = 0;

....

gridComplete: function(data){
    setData();
},

....

beforeRefresh: function(data){
    set = 0;
},

....

function setData(){

if(set == 1) return;
... //create hash up here
  var dataArray = jQuery("#grid").jqGrid('getGridParam', 'data');
  var j = 1;
  for (var rows in dataArray) {
    var key = dataArray[rows].name;
    dataArray[rows].level = hashTable[key];
    j++;
  }
  alert(j);
}
_

これは、ローカルに読み込まれる配列内のすべてのアイテムを循環するわけではありません。たとえば、ページサイズが30に設定されている場合、ローカルに読み込んだアイテムの数に関係なく、alert(j)は30を返します。ただし、グラフを更新すると、jは正しい数になります。 getGridParamの動作がそれぞれの場合で異なるのはなぜですか?

14
WildBill

loadonce: trueを使用する場合、whereを知っておく必要があります。ローカルデータはjqGridによって保持されます。 jqGridには2つのオプションがあります:data_indexdataは、nameの列のcolModelプロパティとしてnameプロパティを持つすべてのアイテムの配列です。 ID(rowid)でアイテムを検索する必要がある場合は、_index[rowid]を使用して、data配列内のrowidを持つアイテムを検索できます。したがって、列'myColumn'のデータを変更するには、次のようにする必要があります。

// first change the cell in the visible part of grid
myGrid.jqGrid('setCell', rowid, 'myColumn', newValue);

// now change the internal local data
var dataArray = myGrid.jqGrid('getGridParam', 'data'),
    indexes = myGrid.jqGrid('getGridParam', '_index');
dataArray[indexes[rowid]].myColumn = newValue;

[〜#〜] updated [〜#〜]:ドキュメント化された getLocalRow メソッドを使用してローカルデータを変更できます:

// first change the cell in the visible part of grid
myGrid.jqGrid('setCell', rowid, 'myColumn', newValue);

// now change the internal local data
myGrid.jqGrid('getLocalRow', rowid).myColumn = newValue;
31
Oleg

グーグルからここに来たすべての人のために、ここに更新された答えがあります!

重要なのはインデックスです。これは、getInd-Methodを呼び出して取得できます。なぜなら、rowID!= localRowDataのインデックスだからです。 (eq。rowId:jqg204、Index:5)

編集: colmodelで「key:true」を設定した場合、独自のrowIdを設定できます(私の例の「jqg ###」とは異なり、通常はデータベーステーブルのPK)

var ind = myGrid.getInd(rowId);
var localRowData  = myGrid.jqGrid('getLocalRow', ind);
localRowData.myColumn = newValue;

お役に立てば幸いです。

0
fr4nk

私は同様の問題がありました:
特定のユーザーアクションで行を更新する必要がありました(無関係)。
そのため、テーブルをフィルタリングした後でも、「データ」オブジェクトからの正確な行を知る必要がありました。
そこで、変更された行を特定する方法を見つけました。「loadComplete」イベントで、「data」オブジェクトの各アイテムにRowIDプロパティを追加しました。

loadComplete: function () {
            if (firstRun) {
                firstRun = false;
                var dataArray = $('#jqGrid').jqGrid('getGridParam', 'data');
                $(dataArray).each(function (index) {
                    dataArray[index].RowID = index + 1;
                });
            }
        }

そして今、フォーマッタコードで、rData.RowIDにアクセスして、アクションが実行された正確な行を識別し、その「データ」表現を取得/設定することができました

0
Alonzzo2