我正在Ext.view.View
类创建一个数据视图,用于显示ajax代理后收到的图像列表。根据Sencha Doc for DataView,itemSelector
属性是必需的。所以我使用它作为itemSelector: 'div.thumb-wrap'
,但是相应的类在嵌套循环内而不是在外循环中,如下所示:
JS代码:
Ext.define("DSApp.Desktop.view.ImageView",{
extend: 'Ext.view.View',
alias : 'widget.imageviewer',
initComponent: function()
{
Ext.apply(this,{
itemId : 'image-data-view',
autoScroll : true,
width : 600,
store : getDataStore(),
tpl : ['<div id="carouselDiv">',
'<tpl for=".">', // 1st loop
'<span>{total}</span>',
'<a href="#" onclick="clickNext({#})">Prev</a>',
'<tpl for="images">', // 2nd loop
'<div class="thumb-wrap">', // itemSelector of my choice
'<div class="thumb"><img src="{src}" title="{caption}"></div>',
'<span class="x-editable">{caption:htmlEncode}</span>',
'</div>',
'</tpl>',
'<div class="x-clear"></div>',
'<a href="#" onclick="clickNext({#})">Next</a>',
'</tpl>',
'</div>'],
multiSelect : true,
trackOver : true,
overItemCls : 'x-item-over',
itemSelector : 'div.thumb-wrap', // its not working
emptyText : 'No images to display',
listeners : {
afterrender : function(current, eOpts) {
current.getStore().load();
},
containerclick : function(current, e ,opts)
{
console.log(current.ownerCt);
}
}
});
this.callParent(arguments);
}
});
function clickNext(index)
{
Ext.Msg.alert("Alert","Just a dummy Alert");
}
JSON:
{
data: {
total: 120,
start: 0,
end: 20,
images: [{...},{...},{...}]
}
}
商店:
Ext.define('ImageModel', {
extend : 'Ext.data.Model',
proxy : {
type : 'ajax',
url: '/images',
noCache : true,
reader : {
type : 'json',
totalProperty: 'total',
rootProperty : 'data'
}
}
});
StackTrace:
Uncaught TypeError: Cannot read property 'internalId' of undefined ext-all.js:22
Ext.cmd.derive.updateIndexes ext-all.js:22
Ext.cmd.derive.refresh ext-all.js:22
Ext.cmd.derive.refresh ext-all.js:22
Ext.cmd.derive.refreshView ext-all.js:22
Ext.cmd.derive.onDataRefresh ext-all.js:22
Ext.cmd.derive.doFire ext-all.js:22
Ext.cmd.derive.fire ext-all.js:22
Ext.cmd.derive.doDispatchEvent ext-all.js:22
Ext.cmd.derive.dispatchEvent ext-all.js:22
Ext.cmd.derive.doFireEvent ext-all.js:22
a.doFireEvent ext-all.js:22
Ext.cmd.derive.fireEvent ext-all.js:22
Ext.cmd.derive.loadRecords ext-all.js:22
Ext.cmd.derive.onProxyLoad ext-all.js:22
Ext.cmd.derive.triggerCallbacks ext-all.js:22
Ext.cmd.derive.setCompleted ext-all.js:22
Ext.cmd.derive.setSuccessful ext-all.js:22
Ext.cmd.derive.process ext-all.js:22
Ext.cmd.derive.processResponse ext-all.js:22
(anonymous function) ext-all.js:22
Ext.apply.callback ext-all.js:22
Ext.cmd.derive.onComplete ext-all.js:22
Ext.cmd.derive.onStateChange ext-all.js:22
(anonymous function) ext-all.js:22
每当我尝试使用itemSelector: 'div.blabla'
时,它只是在控制台中没有任何问题就行了...确实它没有用,因为没有类 blabla ..所以它的混乱给我的东西..任何想法?
答案 0 :(得分:1)
itemSelector的要点是将DOM节点映射到商店中的记录。这意味着,您在itemSelector中包装的内容应该封装一条记录:
itemSelector: '.person',
tpl: [
'some markup',
'<tpl for=".">,
'<div class="person">{name}</div>',
'</tpl>'
],
关于此人的一切都应该在person
div内。
答案 1 :(得分:1)
IMO你过度了。您不需要2个循环,因为您只从服务器返回一个图像数组。那有什么意义呢?
您唯一应该更改的是将total
添加到为模板提供的数据中。它比创建两个循环更容易。例如,您可以在collectData
方法中执行此操作:
collectData: function(records, startIndex){
var data = this.callParent(arguments);
data.total = this.getStore().getTotalCount()
return data;
}
然后你的模板看起来像这样:
tpl : [
'<div id="carouselDiv">',
'<span>{total}</span>',
'<a href="#" onclick="clickNext({#})">Prev</a>',
'<tpl for=".">', // 1st loop
'<div class="thumb-wrap">', // itemSelector of my choice
'<div class="thumb"><img src="{src}" title="{caption}"></div>',
'<span class="x-editable">{caption:htmlEncode}</span>',
'</div>',
'</tpl>',
'<div class="x-clear"></div>',
'<a href="#" onclick="clickNext({#})">Next</a>',
'</div>'
]
此外,您应该更正rootProperty
并将其更改为images
。
担心样本(没有css):http://jsfiddle.net/Xf7N8/6/