选择模型并非设计用于替换,所以...这会很复杂!
您需要重新生成sel模型的初始化,取消上一个模型的连接,并重新连接新模型...
这里有一个示例, 可以将行选择模型替换为复选框模型。它可能仍然包含来自第一个选择模型注册的监听器的内存泄漏,我可能已经忘记了。创建新选择模型依赖于网格的getSelectionModel
方法,该方法实现了网格的disableSelection
、simpleSelect
和multiSelect
选项 (查看代码)。
Ext.widget('grid', {
renderTo: Ext.getBody()
,store: ['Foo', 'Bar', 'Baz']
,selType: 'checkboxmodel'
,columns: [{
dataIndex: 'field1'
,text: "Name"
}]
,listeners: {
selectionchange: function(sm, records) {
var grid = sm.view.up(),
item = grid.down('tbtext');
if (records.length) {
item.setText(
'Selection: ' + Ext.pluck(Ext.pluck(records, 'data'), 'field1').join(', ')
);
} else {
item.setText('No selection');
}
}
}
,tbar: [{
text: "Replace selection model"
,handler: function(button) {
var grid = button.up('grid'),
headerCt = grid.headerCt,
checkColumn = headerCt.down('[isCheckerHd]'),
view = grid.view,
previous = grid.selModel,
sm;
previous.deselectAll();
previous.destroy();
if (previous.onRowMouseDown) {
view.un('itemmousedown', previous.onRowMouseDown, previous);
}
if (previous.onRowClick) {
view.un('itemclick', previous.onRowClick, previous);
}
delete grid.selModel;
delete view.selModel;
grid.selType = 'rowmodel';
sm = grid.getSelectionModel();
view.selModel = sm;
sm.view = view;
if (checkColumn) {
headerCt.remove(checkColumn);
}
if (view.rendered) {
sm.beforeViewRender(view);
sm.bindComponent(view);
}
view.refresh();
}
}]
,bbar: [{
xtype: 'tbtext'
,text: 'No selection'
}]
});