0

组件定义:

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 中

在孩子中附加一个处理程序并访问其父母?孩子不应该依赖父母。只有父母应该知道,该怎么做。

4

1 回答 1

1

解决此问题的一种方法是将组合项组件初始化包装到表单的initComponent方法中。这样,在为组合设置侦听器时,您可以使用this.formMethod来引用表单方法。这是一些代码:

Ext.define('Fiddle.view.FirstForm', {
    extend: 'Ext.form.Panel',
    bodyPadding: 15,

    initComponent: function () {
        Ext.apply(this, {
            items: [{
                xtype: 'combo',
                fieldLabel: 'First Combo',
                store: ['first', 'second'],
                listeners: {
                    'select': this.onComboSelect
                }
            }]
        });

        this.callParent();
    },

    onComboSelect: function () {
        alert('I am a first form method');
    }
});

第二种方法是在组合上使用字符串侦听器,并在表单上将defaultListenerScope设置为 true。这样监听器函数将被解析为表单的方法。再次,一些代码:

Ext.define('Fiddle.view.SecondForm', {
    extend: 'Ext.form.Panel',
    bodyPadding: 15,
    defaultListenerScope: true,

    items: [{
        xtype: 'combo',
        fieldLabel: 'Second Combo',
        store: ['first', 'second'],
        listeners: {
            'select': 'onComboSelect'
        }
    }],

    onComboSelect: function () {
        alert('I am a second form method');
    }
});

这是两种方法的工作小提琴:https ://fiddle.sencha.com/#view/editor&fiddle/27un

于 2017-10-06T20:08:22.703 回答