冰淇淋!我想把我尝试过的所有冰淇淋都列一个清单,并按顺序排列,这样我最喜欢的冰淇淋就在上面,我最不喜欢的就在下面。(清单应该根据冰淇淋的美味程度排序。
如果我在一个数组中建模,我可以做这样的事情:
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
简而言之,有序存储是一种将行为添加到存储的add
、put
和query
方法中的存储。在add
和put
上,存储必须更新其子级的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)));