在ExtJS 4中,我有一个包含动作列的网格。每当触发该动作时,我都想执行“我的行动”。
如果没有MVC,这将是这样的:
/* ... */
{
xtype: 'gridpanel',
columns: [
/* ... */
{
xtype: 'actioncolumn',
items: [{
handler: function(grid, rowIndex, colIndex) {
// my action
}
}]
}
]
}
现在我想介绍一下View-Controller分离。所以我必须将处理程序从View移动到Controller。
但是控制器如何将其方法注册到action列?看ExtJS 4.1 actioncolumn docs,我找不到任何可以听的事件。我之后也找不到设置动作列的处理程序的方法。
那么在使用actioncolumn时如何实现干净的View-Controller分离?
动作列还没有为MVC做好准备吗?
答案 0 :(得分:10)
问题不在于actioncolumn,而在于其不是ExtJs Widgets的项目。这个项目是简单的图像。这就是我们无法以这种方式在control中分配处理程序的原因:
this.control({
'mygrid actioncolumn button[type=edit]' : this.onEdit
然而,这种方式最好。
不幸的是,这种方式是不可能的。但还有另一种方法,它几乎和首选方式一样干净:使用actioncolumn处理程序来触发网格的自定义事件(由你创建):
// view
{
xtype: 'actioncolumn',
items: [{
icon: 'http://cdn.sencha.io/ext-4.1.0-gpl/examples/shared/icons/fam/cog_edit.png',
tooltip: 'Edit',
handler: function(grid, rowIndex, colIndex) {
// fire custom event "itemeditbuttonclick"
this.up('grid').fireEvent('itemeditbuttonclick', grid, rowIndex, colIndex);
}},
// controller
init: function() {
this.control({
'viewport > testpanel': {
itemeditbuttonclick: this.onEdit,
itemdeletebuttonclick: this.onDelete
}
});
},
这是demo。
答案 1 :(得分:3)
这篇文章解释了一种比接受的答案更简单的方法,如果您的网格中恰好有一种actioncolumn
项:
http://mitchellsimoens.com/actioncolumn-and-mvc/
基本上:只需在控制器中监听actioncolumn
的{{1}}事件。但是,如果您需要区分多个click
类型,则无法正常工作。