使用“actioncolumn”时如何执行视图 - 控制器分离(Ext.grid.column.Action)

时间:2012-10-03 20:50:01

标签: extjs4 extjs-mvc

在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做好准备吗?

2 个答案:

答案 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类型,则无法正常工作。