Extjs - 父组件的侦听器不是由子组件触发的
Extjs - Parent component's listener is not triggered from children
我刚开始写 Ext,我已经遇到了一些问题。请记住,我目前正在学习框架。
我有2个观点。
视图 A 有带有侦听器的按钮
xtype: 'button',
text: 'test',
iconCls: 'x-fa fa-search',
margin: '30px 0 10px 2px',
action: 'test',
listeners: {
click: 'refreshGrids'
}
视图 B 扩展了视图 A 并进行了父调用
this.callParent();
现在按钮在两个视图中都可用。
在我的控制器中我有以下功能
refreshGrids: function(obj){
console.log(obj)
}
问题是在视图 A 中我通常可以在按下按钮时看到日志,但在视图 B 中我不能,因为该方法从未被调用过。
现在,如果我不使用控制器中的方法,而是在 click
事件中使用回调,一切正常。
有什么想法吗?
在 ExtJS 6 中,让视图 B 扩展 A,其中 A 有一个控制器相对容易。
您可以在此处运行输入以下代码:https://fiddle.sencha.com/#view/editor
确保将版本设置为版本 6.x(例如 6.7.0),因为版本 7.x 已上线。
这是一个活生生的例子:https://fiddle.sencha.com/#view/editor&fiddle/352k
/** @filename ./BaseController.js */
Ext.define('com.Whosebug.BaseController', {
extend: 'Ext.app.ViewController',
alias: 'controller.base',
refreshGrids: function() {
var view = this.getView();
var className = view.__proto__.$className;
var suffix = view.getButtonTextSuffix();
Ext.Msg.alert(className, 'Refreshing grids for... ' + suffix);
}
});
/** @filename ./ViewA.js */
Ext.define('com.Whosebug.ViewA', {
extend: 'Ext.form.FieldSet',
alias: 'widget.viewa',
controller: 'base',
config: {
buttonTextSuffix: 'A'
},
initComponent: function() {
var me = this;
this.items = {
xtype: 'button',
text: 'Test' + ' ' + this.getButtonTextSuffix(),
iconCls: 'x-fa fa-search',
margin: '30px 0 10px 2px',
action: 'test',
listeners: {
click: 'refreshGrids'
}
};
me.callParent();
}
});
/** @filename ./ViewB.js */
Ext.define('com.Whosebug.ViewB', {
extend: 'com.Whosebug.ViewA',
alias: 'widget.viewb',
buttonTextSuffix: 'B',
initComponent: function() {
// Unless you want to do anything else here, this is unessesary.
this.callParent();
}
});
/** @filename ./App.js */
Ext.application({
name: 'Fiddle',
launch: function() {
Ext.create('Ext.container.Viewport', {
layout: {
type: 'vbox',
align: 'stretch'
},
defaults: {
flex: 1,
border: true
},
items: [{
xtype: 'viewa'
}, {
xtype: 'viewb'
}]
});
}
});
我刚开始写 Ext,我已经遇到了一些问题。请记住,我目前正在学习框架。
我有2个观点。
视图 A 有带有侦听器的按钮
xtype: 'button',
text: 'test',
iconCls: 'x-fa fa-search',
margin: '30px 0 10px 2px',
action: 'test',
listeners: {
click: 'refreshGrids'
}
视图 B 扩展了视图 A 并进行了父调用
this.callParent();
现在按钮在两个视图中都可用。
在我的控制器中我有以下功能
refreshGrids: function(obj){
console.log(obj)
}
问题是在视图 A 中我通常可以在按下按钮时看到日志,但在视图 B 中我不能,因为该方法从未被调用过。
现在,如果我不使用控制器中的方法,而是在 click
事件中使用回调,一切正常。
有什么想法吗?
在 ExtJS 6 中,让视图 B 扩展 A,其中 A 有一个控制器相对容易。
您可以在此处运行输入以下代码:https://fiddle.sencha.com/#view/editor
确保将版本设置为版本 6.x(例如 6.7.0),因为版本 7.x 已上线。
这是一个活生生的例子:https://fiddle.sencha.com/#view/editor&fiddle/352k
/** @filename ./BaseController.js */
Ext.define('com.Whosebug.BaseController', {
extend: 'Ext.app.ViewController',
alias: 'controller.base',
refreshGrids: function() {
var view = this.getView();
var className = view.__proto__.$className;
var suffix = view.getButtonTextSuffix();
Ext.Msg.alert(className, 'Refreshing grids for... ' + suffix);
}
});
/** @filename ./ViewA.js */
Ext.define('com.Whosebug.ViewA', {
extend: 'Ext.form.FieldSet',
alias: 'widget.viewa',
controller: 'base',
config: {
buttonTextSuffix: 'A'
},
initComponent: function() {
var me = this;
this.items = {
xtype: 'button',
text: 'Test' + ' ' + this.getButtonTextSuffix(),
iconCls: 'x-fa fa-search',
margin: '30px 0 10px 2px',
action: 'test',
listeners: {
click: 'refreshGrids'
}
};
me.callParent();
}
});
/** @filename ./ViewB.js */
Ext.define('com.Whosebug.ViewB', {
extend: 'com.Whosebug.ViewA',
alias: 'widget.viewb',
buttonTextSuffix: 'B',
initComponent: function() {
// Unless you want to do anything else here, this is unessesary.
this.callParent();
}
});
/** @filename ./App.js */
Ext.application({
name: 'Fiddle',
launch: function() {
Ext.create('Ext.container.Viewport', {
layout: {
type: 'vbox',
align: 'stretch'
},
defaults: {
flex: 1,
border: true
},
items: [{
xtype: 'viewa'
}, {
xtype: 'viewb'
}]
});
}
});