如何使用ExtJS 4中Controller的控制方法更改范围?

时间:2012-05-07 18:52:04

标签: javascript extjs extjs4

在具有Ext.app.Controller类的control()方法的ExtJS中,我可以将侦听器添加到通过控制器的init()方法内的Ext.ComponentQuery选择的组件。

默认情况下这样做我的处理程序函数中有控制器范围。有没有办法在这里指定其他范围?

例如在这种情况下:

Ext.define('BackOffice.controller.BaseList', {
    extend: 'Ext.app.Controller',

    refs: [
        // some refs
    ],

    init: function() {
        this.control({
            'bo-list-view > toolbar > button[action=create-new]': {
                click: this.onCreateNewClick
            },

            'bo-list-view > toolbar > button[action=edit]': {
                click: this.onEditClick
            },

            'bo-list-view > toolbar > button[action=refresh]': {
                click: this.onRefreshClick
            }
        })
    },

    // ...
});

在处理程序函数中,我想知道单击的确切按钮,以根据此信息执行某些操作。

我尝试通过范围字段在按钮声明中指定范围,这没有用。

此外,我想使用Ext.bind()来解决问题,但要将函数绑定到我需要再次引用该按钮。

使用.on()添加侦听器在init()中不起作用,因为它在应用程序的启动方法之前被调用。

有没有办法从保存范围的控制器中为这个按钮添加监听器?

更新

对按钮的引用作为第一个参数传递给处理函数。 这解决了我的问题,但仍在寻找一种在control()方法中定义范围的方法。

2 个答案:

答案 0 :(得分:2)

您可以使用配置对象来实现更高级的范围功能。

Ext.define('BackOffice.controller.BaseList', {
    extend: 'Ext.app.Controller',

    refs: [
        // some refs
    ],

    init: function() {
        this.control({
            'bo-list-view > toolbar > button[action=create-new]': {
                // This will call onCreateNewClick with global window as the scope
                click: {fn: this.onCreateNewClick, scope: window}
            },

            'bo-list-view > toolbar > button[action=edit]': {
                click: {fn: this.onEditClick, scope: otherScopeObj}
            },

            'bo-list-view > toolbar > button[action=refresh]': {
                click: this.onRefreshClick
            }
        });
    },

    // ...
});

我不知道所有正常的配置是否有效(即单一:真),但范围确实如此。

答案 1 :(得分:1)

如果你看一下click事件的描述:http://docs.sencha.com/ext-js/4-0/#!/api/Ext.button.Button-event-click,你会发现第一个参数将是指向按钮的指针,即你不需要改变范围 - 只需声明参数在您的功能中,您将知道按下了哪个按钮。