extjs - Ext JS 网格面板事件

标签 extjs

我正在开发我的第一个 EXT js mvc 应用程序。我在从 Controller 类向我的网格面板添加事件监听器时遇到问题。

我的问题是为什么我在使用下面的代码通过“on”方法添加事件处理程序时出现以下错误

错误:

Uncaught TypeError: 
    gridPanel.on is not a function
    at constructor.init 

相关代码:

var gridPanel = Ext.ComponentQuery.query('userlist');
gridPanel.on('itemdblclick', this.editUser, gridPanel);

虽然我能够通过不同的方法添加处理程序,但我试图弄清楚通过网格面板引用上的“on”方法添加有什么问题。感谢您的帮助。

谢谢


这是我完整的 Controller 类

Ext.define('AM.controller.Users', {
        extend: 'Ext.app.Controller',

        views: ['user.List'],

        init: function() {

            var gridPanel = Ext.ComponentQuery.query('userlist');
            gridPanel.on('itemdblclick', this.editUser, gridPanel);
        },

        editUser: function() {
            console.log('User edit has begun..');
        }
}, function() {

}); 

还有我的网格面板类:

Ext.define('AM.view.user.List', {
    extend: 'Ext.grid.Panel',
    alias: 'widget.userlist',   
    title: 'All Users',
    id: 'usergrid',

    initComponent: function() {

            this.store = {
                fields: ['name', 'email'],
                data  : [
                    {name: 'Ed',    email: 'ed@sencha.com'},
                    {name: 'Tommy', email: 'tommy@sencha.com'}
                ]
            };

            this.columns = [
                {header: 'Name',  dataIndex: 'name',  flex: 1},
                {header: 'Email', dataIndex: 'email', flex: 1}
            ],

        this.callParent(arguments);

    }
});

最佳答案

Ext.ComponentQuery.query('userlist') 返回已找到组件的数组 - 因此您需要选择数组中的第一项才能实际获取您的组件: Ext.ComponentQuery.query('userlist')[0]

Ext.first('userlist') 简写使这更简单。 (正如评论中提到的@sceborati)

当您使用组件查询时,您是通过其 xtype 进行查询*

您还在您的组件中指定了一个 id,如果您在一个页面上只有一个实例,这是可以的(如果您有多个实例 - 您不应该使用 id) 您可以使用 Ext.getCmp('componentid') 更快地找到组件,因此 Ext.getCmp('userlist') 也适合您。

综上所述,为了更好地利用 ExtJs MVC 功能,您可以切换到使用 ViewController,然后您根本不需要对您的组件进行任何查找:

Ext.define('AM.controller.Users', {
    extend: 'Ext.app.ViewController',
    alias: 'controller.userlist',
    editUser: function () {
        console.log('User edit has begun..');
    }
});

Ext.define('AM.view.user.List', {
    extend: 'Ext.grid.Panel',
    xtype: 'userlist',
    title: 'All Users',
    id: 'usergrid',
    controller: 'userlist',
    store: {
        fields: ['name', 'email'],
        data: [{
            name: 'Ed',
            email: 'ed@sencha.com'
        }, {
            name: 'Tommy',
            email: 'tommy@sencha.com'
        }]
    },
    columns: [{
        header: 'Name',
        dataIndex: 'name',
        flex: 1
    }, {
        header: 'Email',
        dataIndex: 'email',
        flex: 1
    }],
    listeners:{
        itemdblclick:'editUser'
    }
});

注意添加到 Controller 的 alias 配置,以及 View 上相应的 controller 配置。

这意味着您只需在 Controller 上提供方法名称即可指定监听器。

    listeners:{
        itemdblclick:'editUser'
    }

您可能还注意到我已将您的列和存储配置移出 initComponent 方法 - 您可以使用 initComponent,但此方法更简洁。

我创建了一个 fiddle 来演示这个更新后的代码:

https://fiddle.sencha.com/#view/editor&fiddle/1qvu

在定义 Controller 时,您似乎还传递了一个额外的函数作为第三个参数——您应该删除它。


* 你使用了 alias:'widget.userlist'xtype:'userlist'

相同

关于extjs - Ext JS 网格面板事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42450616/

相关文章:

extjs - 如何将项目添加到Extjs面板上的确切位置

javascript - Ext.Create 和 this.callParent

javascript - ExtJs:ajax 调用中的代码执行顺序是什么?

javascript - up() 和 down() 与 Ext.getCmp()

javascript - 使用 ./make_bootstrap.sh 部署 Web 应用程序时存在 Sencha 编译问题; ./make_compile.sh

javascript - 如何使用 ExtJS 4 动态隐藏网格中的子列

javascript - 如何动态更改 Ext js 存储数据

javascript - 如何在extjs中创建快捷键

ipad - 使用 Sencha Touch 时,Google map 标记点击在 iPad 上不起作用

jquery - 是否有一个免费的(LGPL 兼容)jQuery 网格插件,具有与 Ext-JS 网格类似的功能?