冰淇淋!我想列出我尝试的所有冰淇淋,并保持清单的顺序,所以我最喜欢的冰淇淋位于顶部,而我最不喜欢的冰淇淋位于底部。 (这个清单应该以冰淇淋的美味来命令。
如果我在数组中建模,我可以这样做:
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}
但这意味着当我插入或删除冰淇淋时,我需要更新所有冰淇淋的订单属性。呸。
答案 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
简要总结一下,有序商店是一个商店,可以为商店的add
,put
和query
方法添加行为。在add
和put
商店必须更新其子女的订单属性。
这是代码的摘录:
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)));