带有异步数据存储的 GridX Tree Expando REST 调用(大型数据集)

Posted

技术标签:

【中文标题】带有异步数据存储的 GridX Tree Expando REST 调用(大型数据集)【英文标题】:GridX Tree Expando REST call (large dataset) with Async datastore 【发布时间】:2015-03-03 14:35:06 【问题描述】:

我正在使用 GridX,我希望创建一个带有类似于 http://oria.github.io/gridx/demos/tree.html 的“expandoes”的网格以及示例“一列中的所有扩展,异步存储”

我想使用从 REST 调用返回的 JSON 填充网格。

但是,JSON 太大(50MB),所以我想分解它。

我希望能够使用用户需要查看的最少数据量来填充网格,然后当单击扩展时,会进行另一个 REST 调用,并将该行的子项返回并添加到网格中。

require([
'dojo/parser',
'dojo/_base/Deferred',
'gridx/tests/support/data/TreeColumnarTestData',
'gridx/tests/support/data/TreeNestedTestData',
'gridx/tests/support/stores/ItemFileWriteStore',
'gridx/allModules',
'gridx/Grid',
'gridx/core/model/cache/Sync',
'gridx/core/model/cache/Async',
'dijit/ProgressBar',
'dijit/form/NumberTextBox',
'dojo/domReady!'
], function(parser, Deferred, dataSource, nestedDataSource, storeFactory, modules)

store = storeFactory(
    dataSource: dataSource, 
    maxLevel: 4,
    maxChildrenCount: 10
);
store.hasChildren = function(id, item)
    return item && store.getValues(item, 'children').length;
;
store.getChildren = function(item)
    return store.getValues(item, 'children');
;

storeAsync = storeFactory(
    isAsync: true,
    dataSource: dataSource, 
    maxLevel: 4,
    maxChildrenCount: 10
);
storeAsync.hasChildren = function(id, item)
    return item && storeAsync.getValues(item, 'children').length;
;
storeAsync.getChildren = function(item)
    var d = new Deferred();
    console.log('getChildren: ', storeAsync.getIdentity(item));
    setTimeout(function()
        var children = storeAsync.getValues(item, 'children');
        d.callback(children);
    , 1000);
    return d;
;

storeNested = storeFactory(
    dataSource: nestedDataSource, 
    maxLevel: 4,
    maxChildrenCount: 10
);
storeNested.hasChildren = function(id, item)
    return item && storeNested.getValues(item, 'children').length;
;
storeNested.getChildren = function(item)
    var d = new Deferred();
    setTimeout(function()
        var children = storeNested.getValues(item, 'children');
        d.callback(children);
    , 1000);
    return d;
;

var progressDecorator = function()
    return [
        "<div data-dojo-type='dijit.ProgressBar' data-dojo-props='maximum: 10000' ",
        "class='gridxHasGridCellValue' style='width: 100%;'></div>"
    ].join('');
;

layout1 = [
    //Anything except natual number (1, 2, 3...) means all levels are expanded in this column.
    id: 'number', name: 'number', field: 'number',
        expandLevel: 'all',
        width: '200px',
        widgetsInCell: true,
        decorator: progressDecorator,
        editable: true,
        editor: 'dijit/form/NumberTextBox'
    ,
    id: 'id', name: 'id', field: 'id',
    id: 'string', name: 'string', field: 'string',
    id: 'date', name: 'date', field: 'date',
    id: 'time', name: 'time', field: 'time',
    id: 'bool', name: 'bool', field: 'bool'
];
layout2 = [
    //Expandable column defaults to the first one, if no expandLevel provided.
    id: 'id', name: 'id', field: 'id',
    id: 'number', name: 'number', field: 'number',
        widgetsInCell: true,
        decorator: progressDecorator
    ,
    id: 'string', name: 'string', field: 'string',
    id: 'date', name: 'date', field: 'date',
    id: 'time', name: 'time', field: 'time',
    id: 'bool', name: 'bool', field: 'bool'
];
layout3 = [
    id: 'number', name: 'number', field: 'number',
    id: 'string', name: 'string', field: 'string',
    id: 'date', name: 'date', field: 'date',
    id: 'time', name: 'time', field: 'time',
    id: 'bool', name: 'bool', field: 'bool',
    id: 'id', name: 'id', field: 'id'
];
layout4 = [
    id: 'id', name: 'id', field: 'id',
    id: 'number', name: 'number *', field: 'number', expandLevel: 1,
    id: 'string', name: 'string *', field: 'string', expandLevel: 2,
    id: 'date', name: 'date', field: 'date',
    id: 'time', name: 'time *', field: 'time', expandLevel: 3,
    id: 'bool', name: 'bool', field: 'bool'
];


mods = [
    modules.Tree,
    modules.Pagination,
    modules.PaginationBar,
    modules.ColumnResizer,
    // modules.SelectRow,
    modules.ExtendedSelectRow,
    modules.CellWidget,
    modules.Edit,
    modules.IndirectSelectColumn,
    modules.SingleSort,
    modules.VirtualVScroller
];

parser.parse();
);

    <div id='grid2' jsid='grid2' data-dojo-type='gridx.Grid' data-dojo-props='
    cacheClass: "gridx/core/model/cache/Async",
    store: storeAsync,
    structure: layout2,
    paginationBarSizes: [1, 2, 0],
    modules: mods
'></div>

这是示例中使用的代码。我已经从代码中删除了非异步存储和嵌套存储。我不确定如何创建:

A.原始数据存储。它必须是什么类型? dojo.store.memory?还是应该是 jsonrest 商店?

B.我假设我需要对 getChildren 函数进行更改并在此处添加一些内容以负责获取附加数据(展开行的子项)?

我可以只回调孩子,他们会自动添加到异步存储中吗?

以前有人做过类似的事情吗?任何意见或建议将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

查看道场的JsonRest 看看是否有帮助。 您的 getChildren 方法如下所示:

store.getChildren = function(item) 
    return this.query(item.childId);
;

【讨论】:

以上是关于带有异步数据存储的 GridX Tree Expando REST 调用(大型数据集)的主要内容,如果未能解决你的问题,请参考以下文章

使用带有分页的jsonrest时Gridx中的客户端过滤?

Dojo Gridx 程序刷新显示没有数据

dojo gridx 不会从 JSONRest 存储中读取 - 我在这里缺少啥?

xpages gridx jsonREST 和查询/搜索

带有自定义 JsonRest 的网格不加载数据

带有 Dojo JsonRest 内存存储的 ASP.Net QueryString 排序参数