Dojo:在使用Store时处理优先级列表(有序列表)



冰淇淋!我想把我尝试过的所有冰淇淋都列一个清单,并按顺序排列,这样我最喜欢的冰淇淋就在上面,我最不喜欢的就在下面。(清单应该根据冰淇淋的美味程度排序。

如果我在一个数组中建模,我可以做这样的事情:

var iceCreamOrdredList = [
    {name: "Coconut"},
    {name: "Mint Chocolate Chip"},
    ...
    {name: "Banana"} /* Obviously noone really likes banana ice cream*/
}

数组的顺序表明椰子冰淇淋比香蕉更受欢迎。

如果我想在dijit或dgrid中显示我的冰淇淋偏好,那么我需要将数组包装在商店中。内存存储可能是最明显的选择。这意味着要做这样的事情:

var iceCreamStore = new Memory([data: iceCreamOrdredList]);

每当我尝试一个新的冰淇淋时,我都想把它添加到这个数据结构中,并允许我的所有dijit/dgrid更新。这意味着我可能应该这样声明我的商店:

var iceCreamStore = new Observable(new Memory({data: iceCreamOrdredList}));

这在很大程度上起作用。


我一直无法解决的一个问题是,如果有人问我这样的问题如何回答:

"根啤酒"冰淇淋是我的最爱。"根啤酒"在您的优先级列表中的位置是什么?

我可以这样做在商店里找到"根啤酒":

var someIceCream = iceCreamStore.query({name: "Root Beer"});

但这不允许我进入"根啤酒"在商店的位置。

我也可以这样做:

for(var i=0; i<iceCreamStore.data.length; i++){
    if(iceCreamStore.data[i].name == "Root Beer"){
        return i;
    }
}

但这似乎1)沉重2)脱离了API商店的精神。


相反的做法也很棘手。回答问题:

你第n喜欢的冰淇淋是什么

需要以下内容:

return iceCreamStore.data[n]

这看起来很不稳定。


重新订购商店中的元素也很有挑战性。有什么好的模式可以处理重新排序吗?我可以在冰淇淋上加一个优先字段。Ie:

{name: "Cotton candy", order: 33}

但这意味着,当我插入或删除冰淇淋时,我需要更新所有冰淇淋的订单属性。恶心。

如果冰淇淋名称是唯一的,那么我会将Memory Stores idProperty字段设置为"name"。然后你可以做像iceCreamStore.index["Root Beer"]这样的事情,因为dojo商店会保存一个关于某个id所在位置的内部索引

var iceCreamStore = new Observable(new Memory({data: iceCreamOrdredList, idProperty: "name"}));

要获得特定的索引(应该与您的订单相同),可以是:

var priority = iceCreamStore.index["Root Beer"];

我发现的最好的解决方案是使用"OrderedStore"。在DGrid测试代码中可以找到这方面的一个实现。参见此处(参见第292行):

https://github.com/SitePen/dgrid/blob/c8f08142b9ece66401dc3eef35371f4e98fa996e/test/data/base.js

简而言之,有序存储是一种将行为添加到存储的addputquery方法中的存储。在addput上,存储必须更新其子级的order属性。

这是代码的摘录:

return Observable(new Memory(lang.mixin({data: data,
    put: function(object, options){
        object.order = calculateOrder(this, object, options && options.before);
    return Memory.prototype.put.call(this, object, options);
    },
    // Memory's add does not need to be augmented since it calls put
    copy: function(object, options){
        /* Do this if you want copy functionality. */
    },
    query: function(query, options){
        options = options || {};
        options.sort = [{attribute:"order"}];
        return Memory.prototype.query.call(this, query, options);
    }
}, options)));

最新更新