在具有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()方法中定义范围的方法。
答案 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,你会发现第一个参数将是指向按钮的指针,即你不需要改变范围 - 只需声明参数在您的功能中,您将知道按下了哪个按钮。