extjs 提供了很多官方组件,例如 grid,table,tab,却找不到普通的 list 组件,可以通过继承 Ext.view.View 来实现
一个的列表定义
Ext.define('waterApp.view.business.device.DeviceOtherSpecList', { extend: 'Ext.view.View', xtype: 'other-spec-list', padding: '0 8', tpl: new Ext.XTemplate( '<div class="other-spec-wrap">', '<div class="other-spec-title"><span style="vertical-align: middle;">设备其他参数规格</span> <img style="vertical-align: middle; cursor: pointer;" id="otherSpecAddBtn" src="/resources/images/business/add-btn.png" alt=""></div>', '<div class="other-spec-list">', '<tpl for=".">', '<div class="other-spec-item">', '<img class="other-spec-del" src="/resources/images/business/del-btn.png" alt="">', '<div class="other-spec-txt">', '<div class="other-spec-label">{attr}</div>', '<div>{val} <span class="other-spec-unit">{unit}</span></div>', '</div>', '</div>', '</tpl>', '</div>', '</div>' ), store: { data: [ { attr: '核定功率', val: '1000', unit: 'kw', }, ], }, itemSelector: 'div.other-spec-item', listeners: { boxready(ins, opts) { ins .getActionEl() .down('#otherSpecAddBtn') .on({ click() { Ext.getCmp('deviceOtherSpecModalWin').show(); }, }); }, itemclick(view, record, item, index, e, eOpts) { if (e.target.className === 'other-spec-del') { this.getStore().remove(record); } }, },});
其中要注意的配置有itemSelector
,用来实现点击列表项的事件处理
itemSelector 必须是循环的列表项的选择器,例如上面的列表项对应的 class 是 other-spec-item,所以配置为div.other-spec-item
,否则会报错extjs Cannot read property 'internalId' of undefined
获取渲染的列表容器元素
通过getActionEl()
获取列表容器元素后可以绑定一些列表外的元素,例如表头等等的事件处理
boxready (ins, opts) { ins.getActionEl().down('#otherSpecAddBtn').on({ click () { Ext.getCmp('deviceOtherSpecModalWin').show(); } });}
尾部位置添加新元素
Ext.getCmp('otherSpecList').getStore().add(formData);
指定位置添加新元素
Ext.getCmp('otherSpecList').getStore().insert(0, formData);
移除指定元素
获取指定的 record,然后移除
Ext.getCmp('otherSpecList').getStore().remove(record);