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

时间:2014-04-16 15:24:09

标签: javascript 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]);

每当我尝试新的冰淇淋时,我想将它添加到此数据结构中,并允许我的所有dijits / dgrids更新。这意味着我应该像这样声明我的商店:

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

这在很大程度上运作良好。


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

  'Root Beer'冰淇淋是我的最爱。 “根啤酒”在您的优先列表中的位置是什么?

我可以通过这样做在商店找到'Root Beer':

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

但这不允许我在商店中访问“Root Beer”的位置。

我也可以这样做:

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

但这似乎1)重2)出于商店API的精神。


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

  

你最喜欢的冰淇淋是什么

需要以下内容:

return iceCreamStore.data[n]

这似乎非常难以存储。


重新排序商店中的元素也具有挑战性。处理重新排序有什么好的模式吗?我可以在冰淇淋上附上一个优先领域。即:

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

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

2 个答案:

答案 0 :(得分:1)

如果冰淇淋名称是唯一的,那么我会将Memory Stores idProperty字段设置为&#34; name&#34;。然后你可以做像iceCreamStore.index [&#34; Root Beer&#34;]之类的东西,因为dojo商店会在某个id所在的位置保留一个内部索引。以下是基于您的代码的示例:

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

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

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

答案 1 :(得分:0)

我发现的最佳解决方案是使用&#34; OrderedStore&#34;。可以在DGrid测试代码中找到其中的一个实现。见这里(见第292行):

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

简要总结一下,有序商店是一个商店,可以为商店的addputquery方法添加行为。在addput商店必须更新其子女的订单属性。

这是代码的摘录:

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)));