Как получить отфильтрованные строки из GridX?

Я использую Dojo GridX со многими модулями, включая фильтр:

grid = new Grid({
    cacheClass : Cache,
    structure: structure,
    store: store,
    modules : [ Sort, ColumnResizer, Pagination, PaginationBar, CellWidget, GridEdit,
         Filter, FilterBar, QuickFilter, HiddenColumns, HScroller ],
    autoHeight : true, autoWidth: false,
    paginationBarSizes: [25, 50, 100],
    paginationBarPosition: 'top,bottom',
}, gridNode);
grid.filterBar.applyFilter({type: 'all', conditions: [
    {colId: 'type', condition: 'equal', type: 'Text', value: 'car'}
]})

Я хотел получить доступ к элементам, которые соответствуют установленному фильтру. Я путешествовал по свойству grid в проводнике DOM, я нашел много ссылок на магазины во многих модулях, но все они содержали все элементы.

Можно ли узнать, какие элементы видны в сетке, потому что они соответствуют фильтру или, по крайней мере, те, которые видны на текущей странице? Если да, то как это сделать?


person Danubian Sailor    schedule 20.02.2014    source источник


Ответы (3)


Мое решение:

try {
    var filterData = [];
    var ids = grid.model._exts.clientFilter._ids;
    for ( var i = 0; i < ids.length; ++i) {
        var id = ids[i];
        var item = grid.model.store.get(id);
        filterData.push(item);
    }
    var store = new MemoryStore({
        data : filterData
    });

} catch (error) {
    console.log("Filter is not set.");
}
person AirG    schedule 11.12.2014

Мне удалось получить отфильтрованные строки данных gridX с помощью gridX Exporter. Добавьте этот модуль экспортера в свою сетку. Этот модуль экспортирует отфильтрованные данные. Затем конвертируйте CSV в Json. Существует множество java-скриптов для преобразования CSV в Json.

this.navResult.grid.exporter.toCSV(args).then(this.showResult, this.onError, null)

person PiGG    schedule 13.08.2014

На основе ответа AirG я разработал следующее решение. Учтите, что есть два случая: с фильтром или без него, и что вы должны знать порядок строк, если вы применили какую-то сортировку. По крайней мере, это работает для меня.

    var store = new Store({
        idProperty: "idPeople", data: [
            { idPeople: 1, name: 'John', score: 130, city: 'New York', birthday: '31/02/1980' },
            { idPeople: 2, name: 'Alice', score: 123, city: 'Wáshington', birthday: '07/12/1984' },
            { idPeople: 3, name: 'Lee', score: 149, city: 'Shanghai', birthday: '8/10/1986' },
            ...
        ]
    });
    
    gridx = new GridX({
        id: 'mygridx',
        cacheClass: Cache,
        store: store,
        ...
        modules: [
            ...
            {
                moduleClass: Dod,
                defaultShow: false,
                useAnimation: true,
                showExpando: true,
                detailProvider: gridXDetailProvider
            },
            ...
        ],
        ...
    }, 'gridNode');
    
    
    function gridXDetailProvider (grid, rowId, detailNode, rendered) {
        gridXGetDetailContent(grid, rowId, detailNode);
        rendered.callback();
        return rendered;
    }
    
    function gridXGetDetailContent(grid, rowId, detailNode) {
        if (grid.model._exts.clientFilter._ids === undefined || grid.model._exts.clientFilter._ids === 0) {
            // No filter, with or without sort
            detailNode.innerHTML = 'Hello ' + grid.row(grid.model._cache._priority.indexOf(rowId)).item().name + " with id " +
                                grid.row(grid.model._cache._priority.indexOf(rowId)).item().idPeople;
        } else {
            // With filter, with or without sort
            detailNode.innerHTML = 'Hello ' + grid.row(grid.model._exts.clientFilter._ids.indexOf(rowId)).item().name + " with id " +
                                grid.row(grid.model._exts.clientFilter._ids.indexOf(rowId)).item().idPeople;
        }
    }

Надеюсь, это поможет, Сантьяго Оркахо

person Santiago Horcajo    schedule 22.04.2015