gpt4 book ai didi

javascript - ExtJS:如何将 itemSelector 用于具有嵌套循环的 XTemplate?

转载 作者:行者123 更新时间:2023-11-30 17:22:34 26 4
gpt4 key购买 nike

我正在研究 Ext.view.View类创建一个数据 View ,用于显示在 ajax 代理之后接收到的图像列表。根据 DataView 的 Sencha Doc,itemSelector属性(property)是强制性的。所以我用它作为 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'
}
}
});

堆栈跟踪:

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 这样的类。所以这对我来说有点令人困惑。有什么想法吗?

最佳答案

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

Worging 示例(无 CSS):http://jsfiddle.net/Xf7N8/6/

关于javascript - ExtJS:如何将 itemSelector 用于具有嵌套循环的 XTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24863838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com