单击后不会调用我的ExtJS按钮的处理程序。现在代码看起来像这样。
Ext.define('EDS.view.selector.Container', {
extend: 'Ext.form.Panel',
alias : 'widget.selectorcontainer',
title: 'Selector_V2',
renderTo: 'input-div',
layout: 'fit',
height: '100%',
items: [
{
xtype: 'tabpanel',
defaults: {
bodyPadding: 10
},
}
],
buttons: [
{
text: 'Reset',
handler: function(){
console.log("Reset");
this.up('form').getForm().reset();
}
},
{
text: 'Add to constrain',
handler: this.addConstrain,
}
],
/*
* Logic for button "Add to constrain"
*
* Adds an entry into the constrain list describing a person, cost center or an application
*/
addConstrain: function(button, event){
console.log('Add_to_constrain clicked');
}
});
最初这个'selectorcontainer'被直接放在我的app.js.但我把它提取到一个独立的视图中。在提取之前,它完美无缺,但现在它无法正常工作。
顺便说一下,我有两个按钮,第一个“重置”工作正常。所以我想知道与该范围有关的“this.addConstrain”是否有任何问题。答案 0 :(得分:5)
你是对的,这是一个范围问题 - this
不是你定义的类;它是调用Ext.define
函数时的范围(可能是window
)。有几种方法可以解决这个问题。最简单的(在我看来)是将处理程序更改为与重置处理程序类似的工作:
{
text: 'Add to constrain',
handler: function(btn, e) {
//'this' is now the button
this.up('selectorcontainer').addConstrain(btn, e);
}
}
您也可以将这些按钮添加为initComponent
功能的一部分,而不是将它们定义为Ext.define
配置的一部分。
initComponent: function() {
//'this' is now the selector container
this.buttons = [{
text: 'Reset',
handler: function(){
console.log("Reset");
this.up('form').getForm().reset();
}
}, {
text: 'Add to constrain',
handler: this.addConstrain
}];
this.callParent();
}
答案 1 :(得分:3)
设计课程的正确方法是这样的。在执行callParent之前,将配置设置应用于对象。
Ext.define('EDS.view.selector.Container', {
extend: 'Ext.form.Panel',
alias : 'widget.selectorcontainer',
title: 'Selector_V2',
renderTo: 'input-div',
layout: 'fit',
height: '100%',
initComponent: function() {
Ext.applyIf(this, {
items: [
{
xtype: 'tabpanel',
defaults: {
bodyPadding: 10
}
}
],
buttons: [
{
text: 'Reset',
scope: this, // <--- scope to form panel
handler: function(){
console.log("Reset");
this.getForm().reset();
}
},
{
text: 'Add to constrain',
scope : this, // <--- scope to form panel
handler: this.addConstrain
}
]
});
this.callParent(arguments);
}
/*
* Logic for button "Add to constrain"
*
* Adds an entry into the constrain list describing a person, cost center or an application
*/
addConstrain: function(button, event){
console.log('Add_to_constrain clicked');
}
});