Ext.define('Retroplanner.view.dimension.DimensionMapping', {
alias: 'widget.dimensionMapping',
extend: 'Ext.form.Panel',
...
items: [{
xtype: 'combo'
}, ...
]
A「select
」的子項的處理程序必須創建一個小部件,這個小部件添加到items
陣列其父。
在這個子項的內部,它的'select'處理程序,我可以通過一些搜索技術找到它的父項。但如果可能的話,我想避免它。我沒有父母的引用變量。
一個更好的辦法是 - 在父創建功能,並以某種方式將其固定到子項:
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中可以使用
將子句處理程序添加到子項中並訪問其父項?小孩不應該依賴其父母。只有父母應該知道,該怎麼做。
謝謝!以下是它的工作原理簡介:https://www.sencha.com/blog/declarative-listeners-in-ext-js-5/ – Alexandr