【发布时间】:2011-03-27 13:00:19
【问题描述】:
在 Sencha Touch 中,我经常需要一个 Ext.DataView 面板,其中包含一个小的子集记录,甚至是商店中集合中的一条记录。
例如,我可能有一个 Car 的模型,它的 app.stores.cars 商店中有数千条汽车记录,但我想展示这些项目的一小部分(比如;只是跑车 ) 在我的 listOfSportsCars DataView 中,同时还在我的 listOfCars DataView 中显示更大的完整汽车集。
我的第一个想法是使用多个商店。所以我有一个主要商店来存放所有汽车的大清单,第二个商店有我的跑车子集的过滤器。但是,现在从一个存储更新模型不会自动更新另一个存储中的记录,因此这违背了使用 DataView 的目的,因为更新记录时更改不会在页面中的任何地方更新。
我的第二次尝试是覆盖 DataView 上的 collectData 方法,这听起来完全就像我追求的那样:
var card = new Ext.DataView({
store: app.stores.cars,
collectData: function(records, startIndex){
// map over the records and collect just the ones we want
var r = [];
for( var i=0; i<records.length; i++ )
if( records[i].data.is_sports_car )
r.push( this.prepareData(records[i].data, 0, records[i]) );
return r;
},
tpl: new Ext.XTemplate([
'<tpl for=".">',
'<div class="car">{name}</div>',
'</tpl>'
]),
itemSelector: 'div.car'
});
可以在here找到一个完整的例子。
但是,尽管有记录表明我可以/应该重写此方法,但 Sencha Touch 真的 不喜欢你弄乱 collectData 返回的数组的长度,所以这已经死了-结束。
其他人如何处理显示/更新相同记录的多个集合?
更新 有一个错误阻止 collectData 按预期工作。该错误已在 Sencha Touch 1.1.0 中得到修复。
【问题讨论】:
-
好问题。我也在使用多家商店,想知道是否有更好的方法。
-
你到底是从哪里得到错误的?你试过调试这个吗?
-
@sa 在记录更改时运行
replaceElement时,ST 似乎盲目地尝试查找和替换所有数据视图中记录的 HTML,并且不会尝试完全刷新数据视图。由于尝试更新在过滤/收集列表中找不到的记录,它会引发parentNode not found错误。如果有人想尝试一下,我已经添加了一个指向完整要点示例的链接。 -
我在最新的 ST 版本中使用了你的演示代码,并用 chrome 打开了所有内容。但是没有错误。如果我按下按钮,视图就会用斯柯达更新。您能否提供有关该错误的更多信息?比如测试环境、版本等等……
-
@sra 我很密集。添加一个答案,告诉我更新到最新的 ST(我的错误现在已修复)并领取您的赏金。我没有注意到我运行的是以前的版本。
标签: extjs sencha-touch