对 Dojo 商店物品进行排序

Posted

技术标签:

【中文标题】对 Dojo 商店物品进行排序【英文标题】:Sort Dojo store items 【发布时间】:2017-03-06 13:07:09 【问题描述】:

所以,我有一个 dojo 脚本,其中我将 4 行推送到数据网格中。像这样的,

var data = 
            identifier: "id",
            items: []
            ;

var data_list = [
         col1: "normal", col2: false, col3: 'Cut are not followed by two hexadecimal', col4: 29.91,
         col1: "important", col2: false, col3: 'Decause a % sign always indicates', col4: 9.33,
         col1: "important", col2: false, col3: 'Aigns can be selectively', col4: 19.34,
         col1: "normal", col2: false, col3: 'Begin the action', col4: 5.6
        ];

var rows = 4;

for(var i = 0, l = data_list.length; i < rows; i++)

    data.items.push(lang.mixin( id: i+1 , data_list[i%l]));


var store = new ItemFileWriteStore(data: data);

/*set up layout*/
var layout = [[
        name: 'Column 1', field: 'id', width: '100px',
        name: 'Column 2', field: 'col2', width: '100px',
        name: 'Column 3', field: 'col3', width: '200px',
        name: 'Column 4', field: 'col4', width: '150px'
        ]];

/*create a new grid*/
var grid = new DataGrid(
            id: 'grid',
            store: store,
            structure: layout,
            rowSelector: '20px');

然后,我有一个我使用的功能

dojo.forEach(grid.store._arrayOfAllItems, function (item) 
//do something

但在调用 forEach 循环之前,我需要根据 col3

对项目进行排序

现在,要根据 col3 对项目进行排序,我已经尝试过

            var noOfItems = store._arrayOfAllItems.length;
            var items = new Array(noOfItems);
            for(i = 0; i < noOfItems; i++)
            
                items[i] = grid.getItem(i);
            

            for(i = 0; i < noOfItems; i++)
            
                for(j = 0; j < noOfItems - 1; j++)
                
                    var a = store.getValue(items[j], "col3");
                    var b = store.getValue(items[j+1], "col3");

                    if(a.localeCompare(b) == 1)
                    
                        [items[j], items[j+1]] = [items[j+1], items[j]];
                    
                
            

            grid.setItems(items);

但即便如此,

 for(i = 0; i < grid.store._arrayOfAllItems.length; i++)
 
    var items = grid.store._arrayOfAllItems;
    document.write(grid.store.getValue(items[i], "col3")+"<br>");
 

打印项目的未排序排列。 我也尝试过使用

grid.store.fetch(onComplete: displaySortItems , sort: [attribute: "col3"] );

但事实证明 fetch() 没有返回任何东西fetch() FAQ,即使我尝试对 displaySortItems() 中的项目进行排序,它也没有反映在函数范围之外。

那么,当使用grid.store._arrayOfAllItems 时,有什么方法可以得到一个排序好的数组(基于col3)。

即使使用grid.store._arrayOfAllItems,我是否可以对项目数组进行排序并保留更改。请帮忙!

【问题讨论】:

【参考方案1】:

您需要编写回调函数才能使用 fetch()。 ItemFileReadStore 的文档提供了一个example for custom sorting。 您至少需要一个 onComplete 和 onError 函数。

var gotItems = function(items, request) 
    // Process your items here
    for(i = 0; i < items.length; i++) 
    console.log(items[i]);
    
;

var fetchFailed = function(error, request) 
    alert("Fetch failed");
;

var sortAttributes = [attribute: "col3", descending: false];

store.fetch(query: , onComplete: gotItems, onError: fetchFailed, sort: sortAttributes);

更新fetch() 在交付项目时进行排序,而不是在内部进行排序。如果要再次排序,可以再次调用fetch(),为onComplete提供另一个功能。

在以“_”开头的 dojo 属性(如 _arrayOfAllItems)中被视为“私有”。您仍然可以访问它们,但修改它们不是一个好主意。 ItemFileWriteStore 将在内部对其进行管理。如果您想要一个排序数组,您可以在传递给fetch() 的函数中构建自己的副本。

【讨论】:

正如我所提到的,fetch()onComplete 以及 sort: sortAttributes 可以很好地对 items[] 进行排序。但我的问题是,在store.fetch() 调用之后,已排序的 items[] 数组不会保持排序状态。尝试在store.fetch(); 之后将所有项目值打印为grid.store.getValue(items[i], "col3")。它们再次未排序! fetch() 在交付商品时存储,而不是在内部存储。如果您想再次排序,可以再次调用fetch(),为onComplete 提供另一个功能。 那么,有没有其他方法可以对 items[] 进行排序,以便 grid.store._arrayOfAllItems 返回排序后的数组? :( 我更新了答案。如果你想要一个排序数组,最好的选择是创建一个单独的副本。 你说的我已经试过了。将items[] 复制到newItems[]。对newItems[]grid.setItems(newItems); 进行排序。但徒劳无功。网格仍然打印出未排序的 items[] 数据。请帮忙!【参考方案2】:

您可以在初始化网格时声明排序顺序。

var grid = new Grid(
    sortInitialOrder: [colId: "Genre", descending: true,colId: "Artist", descending: true]
);

【讨论】:

但是我最初不想对网格进行排序,我只想要在调用dojo.forEach(grid.store._arrayOfAllItems, function (item) 之前排序的网格(w.r.t col3尝试使用函数对对象数组进行排序。 正如问题中提到的,我已经这样做了。但是网格不会在函数范围之后保持排序。

以上是关于对 Dojo 商店物品进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何让 cellWidgets 中的 dojo gridx dojo 小部件自动写入商店?

extjs4.1 根据用户定义的标准对商店进行排序

如何按受欢迎程度对 iTunes 商店 API 实体 = 歌曲进行排序?

更改从商店加载选项的下拉 dojo 的字体大小

Ember.js:让组件观察商店物品的值变化

[CSP-S模拟测试]:Market(背包DP)