2012-02-08 10 views
1

続行this topic拡張ノードをクッキーに保存します。それは最善の方法ですか?拡張されたTreeGridノードをクッキーに送信

JSONのデータチェックではわかりません。

なぜexpandRowが機能しないのですか?

var gridId = "#table"; 
var grid = $(gridId); 
grid.jqGrid({ 

... 

loadComplete: function() { 
var ids = grid.jqGrid('getDataIDs'); 

var cookie = $.cookie(gridId + '_expanded'); 
var expanded = false; 

if (typeof(cookie) == 'string') 
var expanded = JSON.parse(cookie); 

for (var i=0;i<ids.length;i++) { 
var id=ids[i]; 
var row_data = $(this).jqGrid('getRowData', id); 

if (expanded && id in expanded && expanded[id] == 'true') 
$(gridId + ' tr#' + id + ' div.treeclick').trigger("click"); 
//Why it doesn't work? 
//grid.jqGrid('expandRow', row_data); 

} 
} 

... 

}); 

function setCookie() { 
      var ids = grid.jqGrid('getDataIDs'); 

      var expanded = Object(); 
      var string = ''; 

      for (var i=0;i<ids.length;i++) {  
       var id=ids[i]; 
       var rowData = grid.jqGrid('getRowData', id);     

       if (rowData.parent != '' && grid.jqGrid('isVisibleNode', rowData) === true) 
        expanded[rowData.parent] = true 
      } 

      for (e in expanded) 
       string += '"' + e + '":' + '"' + expanded[e] + '",'; 

      $.cookie(gridId + '_expanded', '{'+ string.substring(0, string.length - 1) + '}', { expires: 365 });  
} 

var orgExpandNode = $.fn.jqGrid.expandNode, orgCollapseNode = $.fn.jqGrid.collapseNode; 

     $.jgrid.extend({ 
      expandNode : function(rc) { 
       orgExpandNode.call(this, rc); 
       setCookie();    
      }, 
      collapseNode : function(rc) { 
       orgCollapseNode.call(this, rc); 
       setCookie();       
      }, 
}); 

P.私はいつもこの愚かな警告を得る:)

あなたの投稿はコードセクションを説明する文脈があまりありません。あなたのシナリオをより明確に説明してください。

+0

を使用すると、すべてのツリーノードを消費しているサーバーからの子をロードするために、一度使用アヤックスのでツリーグリッドをロードしますか?私は後でこの問題を調べようとします。私が使う前に[回答](http://stackoverflow.com/a/8436273/315935)と[this one](http://stackoverflow.com/a/8547852/315935)を読むことをお勧めしますクッキーの代わりに 'localStorage'を使います。おそらくそれはあなたの場合でも良い方法です。 – Oleg

+0

すべてのデータ(親と子供について)は、グリッドの構築中にAjax経由で一度来ました – dr0zd

+0

私の質問は、ツリーノードを展開中にオンデマンドでロードされる* 1 * Ajaxリクエストを介してすべてのデータがロードされるかどうかでした。 – Oleg

答えて

5

クッキーの代わりにlocalStorageを使用することをお勧めします。その理由をthe answerに説明します。デモのthe demoベースをthe answeranother oneから作成しました。 the demoの場合は、私の最近のanswerのテストデータを使用しました。

the demoいくつかのツリーノードで、F5でグリッドをリロードしてください。すべての展開された行は、再読み込み後に展開されたままになります。

デモのコードあなたは以下見つける:

var $grid = $('#treegridCompanies'), 
    saveObjectInLocalStorage = function (storageItemName, object) { 
     if (typeof window.localStorage !== 'undefined') { 
      window.localStorage.setItem(storageItemName, JSON.stringify(object)); 
     } 
    }, 
    removeObjectFromLocalStorage = function (storageItemName) { 
     if (typeof window.localStorage !== 'undefined') { 
      window.localStorage.removeItem(storageItemName); 
     } 
    }, 
    getObjectFromLocalStorage = function (storageItemName) { 
     if (typeof window.localStorage !== 'undefined') { 
      return JSON.parse(window.localStorage.getItem(storageItemName)); 
     } 
    }, 
    myColumnStateName = function (grid) { 
     return window.location.pathname + '#' + grid[0].id; 
    }, 
    idsOfExpandedRows = [], 
    updateIdsOfExpandedRows = function (id, isExpanded) { 
     var index = $.inArray(id, idsOfExpandedRows); 
     if (!isExpanded && index >= 0) { 
      idsOfExpandedRows.splice(index, 1); // remove id from the list 
     } else if (index < 0) { 
      idsOfExpandedRows.push(id); 
     } 
     saveObjectInLocalStorage(myColumnStateName($grid), idsOfExpandedRows); 
    }, 
    orgExpandRow = $.fn.jqGrid.expandRow, 
    orgCollapseRow = $.fn.jqGrid.collapseRow; 

idsOfExpandedRows = getObjectFromLocalStorage(myColumnStateName($grid)) || []; 

$grid.jqGrid({ 
    url: 'SPATEN-TreeGrid2.json', 
    datatype: 'json', 
    ajaxGridOptions: { contentType: "application/json" }, 
    jsonReader: { 
     id: "CompanyId", 
     cell: "", 
     root: function (obj) { return obj.rows; }, 
     page: function() { return 1; }, 
     total: function() { return 1; }, 
     records: function (obj) { return obj.rows.length; }, 
     repeatitems: true 
    }, 
    beforeProcessing: function (data) { 
     var rows = data.rows, i, l = rows.length, row, index; 
     for (i = 0; i < l; i++) { 
      row = rows[i]; 
      index = $.inArray(row[0], idsOfExpandedRows); 
      row[5] = index >= 0; // set expanded column 
      row[6] = true;  // set loaded column 
     } 
    }, 
    colNames: ['CompanyId', 'Company'], 
    colModel: [ 
     { name: 'CompanyId', index: 'CompanyId', width: 1, hidden: true, key: true }, 
     { name: 'Company', index: 'Company', width: 500 } 
    ], 
    height: 'auto', 
    pager: '#pager', 
    rowNum: 10000, 
    sortable: false, 
    treeGrid: true, 
    treeGridModel: 'adjacency', 
    ExpandColumn: 'Company' 
}); 
$grid.jqGrid('navGrid', '#pager', {edit: false, add: false, del: false, search: false}); 
$grid.jqGrid('navButtonAdd', '#pager', { 
    caption: "", 
    buttonicon: "ui-icon-closethick", 
    title: "Clear saved grid's settings", 
    onClickButton: function() { 
     removeObjectFromLocalStorage(myColumnStateName($(this))); 
     window.location.reload(); 
    } 
}); 
$.jgrid.extend({ 
    expandRow: function (rc) { 
     //alert('before expandNode: rowid="' + rc._id_ + '", name="' + rc.name + '"'); 
     updateIdsOfExpandedRows(rc._id_, true); 
     return orgExpandRow.call(this, rc); 
    }, 
    collapseRow: function (rc) { 
     //alert('before collapseNode: rowid="' + rc._id_ + '", name="' + rc.name + '"'); 
     updateIdsOfExpandedRows(rc._id_, false); 
     return orgCollapseRow.call(this, rc); 
    } 
}); 
+0

ありがとう!!!!!! – dr0zd

+0

@ gv0zd:ようこそ! – Oleg

関連する問題