【问题标题】:How can I change the scope using control method of a Controller in ExtJS 4?如何使用 ExtJS 4 中控制器的控制方法更改范围?
【发布时间】:2012-05-07 18:52:03
【问题描述】:

在带有 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() 方法中定义范围的方法。

【问题讨论】:

    标签: javascript extjs extjs4


    【解决方案1】:

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

    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
                }
            });
        },
    
        // ...
    });
    

    我不知道所有正常配置是否都有效(即 single: true),但 scope 可以。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 啊这个()真可惜,我在最后一刻快速编辑了代码并错过了它,感谢您提及将修复示例。
      • 关于添加“范围:this”,这在 control() 方法的情况下不起作用,它说我只能在那里指定处理程序。在这种情况下,使用第一个参数对按钮有效,但不适用于一些没有此功能的自定义第三方组件,所以我仍然有问题
      • 我在很多控制器中肯定使用scope: this。但实际上这样做是为了将范围带回控制器类。如果您想将某个按钮指定为范围 - 您甚至如何检测您需要的元素?您正在使用 refs 访问它。
      • 你说得对,我认为在这种情况下为组件本身设置范围并不是一个好主意。我想我会尝试重新实现向它们触发其他组件的自定义事件。然后我就可以从第一个参数中使用它,就像按钮一样。您能否编辑您的答案,只留下最后一部分与第一个论点建议,然后它将与问题更相关,我将能够接受它,谢谢!
      • 这是最好的方法。当组件应该让处理程序知道此信息时,您不应该尝试传递指向某些东西的指针。
      猜你喜欢
      • 2018-11-20
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多