组件定义:
Ext.define('Retroplanner.view.dimension.DimensionMapping', {
alias: 'widget.dimensionMapping',
extend: 'Ext.form.Panel',
...
items: [{
xtype: 'combo'
}, ...
]
子项的“ select
”处理程序必须创建一个小部件并将此小部件添加到items
其父项的数组中。
在这个子项内部,它的“选择”处理程序,我可以通过一些搜索技术找到它的父项。但如果可能的话,我想避免它。我也没有对父级的引用变量。
更好的方法是 - 在父项中创建函数,并以某种方式将其附加到子项:
Ext.define('Retroplanner.view.dimension.DimensionMapping', {
...
onSiRemoteCombo: function(cmb, rec, idx) {
alert("select handler");
var newItem = Ext.widget('somexType');
this.items.add(newItem);
}
问题,如何附加onSiRemoteCombo
?
我在这里找到了类似的解决方案:How to create listener for child component's custom event
首先,它对我不起作用。我可以举一个我尝试使用的完整示例。第二,我想通过最常见的方式/在常见的地方创建项目,而不是通过 initComponent 方法。我想要类似的东西:
Ext.define('Retroplanner.view.dimension.DimensionMapping', {
...
afterRender: function() {
var me = this;
//exception here
//Uncaught TypeError: Cannot read property 'on' of undefined
me.items[0].on('select', onSiRemoteCombo, this);
},
items: [{
xtype: 'combo'
}, ...
],
onSiRemoteCombo: function(cmb, rec, idx) {
alert("Ttt");
var dimensionMapping = Ext.widget('propGrid');
this.getParent().add(dimensionMapping);
}
但我得到一个例外:
//exception here
//Uncaught TypeError: Cannot read property 'on' of undefined
me.items[0].on('select', onSiRemoteCombo, this);
而且,在每次渲染后附加一个监听器,真的是个坏主意。
此类用例是否有任何最佳实践?理想情况下,如果它可以在不同版本的 Ext JS 中工作,至少在 5.x 和 6.x 中
在孩子中附加一个处理程序并访问其父母?孩子不应该依赖父母。只有父母应该知道,该怎么做。