如何在Extjs 5.1中修复默认的Tab键导航?

时间:2016-01-12 19:49:46

标签: javascript extjs extjs4 extjs5 keyboard-navigation

目前我正在进行从ExtJS 4.2到ExtJS 5.1的代码迁移。我注意到许多组件的默认行为发生了很多变化。

我注意到的一件事是组件之间的默认tab键导航已经改变,在这种情况下是不可预测的。

要重现,请转到4.2 fiddle here,然后点击第一个文本字段,点击标签,然后将焦点更改为状态组合框;再次点击标签,它将转到“下一步”按钮,再次点击标签,它会转到“第二个选项”单选按钮,依此类推。

然后在5.1 fiddle here重复同样的事情。你会注意到的第一件事是“我的第一选项”电台未经检查(这是另一个问题),但我想解决的主要问题是按Tab键按下的奇数顺序。

如何使标签键导航的行为与4.2版本相同?

在此处包含示例代码:

// The data store containing the list of states
var states = Ext.create('Ext.data.Store', {
    fields: ['abbr', 'name'],
    data : [
        {"abbr":"AL", "name":"Alabama"},
        {"abbr":"AK", "name":"Alaska"},
        {"abbr":"AZ", "name":"Arizona"}
    ]
});

Ext.application({
    name : 'Fiddle',

    launch : function() {
        Ext.create('Ext.form.Panel', {
            title: 'My Navigable Panel',
            items: [
                {
                    xtype: 'radiogroup',
                    layout: 'vbox',                    
                    items: [
                        {
                            xtype: 'radiofield',
                            boxLabel: 'My First Option',
                            name: 'radio',                            
                            value: true,
                            checked: true,
                            listeners: {
                                change: function(group, newValue, oldValue) {

                                    if(newValue) {
                                        group.up('form').down('fieldcontainer[name=containerA]').show();
                                        group.up('form').down('fieldcontainer[name=containerB]').hide();
                                    } else {
                                        group.up('form').down('fieldcontainer[name=containerA]').hide();
                                        group.up('form').down('fieldcontainer[name=containerB]').show();                                        
                                    }
                                }
                            },
                        },
                        {
                            xtype: 'fieldcontainer',
                            layout: 'hbox',
                            name: 'containerA',                            
                            fieldDefaults: {
                                labelAlign: 'top',
                                margin: '0 5 0 5'
                            },
                            items: [
                                {
                                    xtype: 'textfield',
                                    fieldLabel: 'First field',
                                    allowBlank: false
                                },
                                {
                                    xtype: 'combo',
                                    fieldLabel: 'State',
                                    width: 50,
                                    store : states,
                                    queryMode: 'local',
                                    displayField: 'name',
                                    valueField: 'abbr',
                                },
                                {
                                    xtype: 'button',
                                    text: 'Next'
                                }
                            ]
                        },
                        {
                            xtype: 'radiofield',
                            boxLabel: 'My Second Option',
                            name: 'radio',
                            value: false
                        }
                    ]

                },
                {
                    xtype: 'fieldcontainer',
                    padding: '0 0 0 25',
                    name: 'containerB',
                    hidden: true,
                    items: [{
                        xtype: 'radiogroup',
                        layout: 'vbox',
                        items: [
                            {
                                xtype: 'radiofield',
                                fieldLabel: 'My nested radio button A',
                                name: 'subradio'
                            },
                            {
                                xtype: 'radiofield',
                                fieldLabel: 'My nested radio button B',
                                name: 'subradio'
                            }
                        ]
                    }]
                }
            ],
            renderTo: Ext.getBody()
        }).show();
    }
});

1 个答案:

答案 0 :(得分:0)

好吧,我没有找到一种方法来告诉ExtJS 5.1导航表单,就像它在4.2上所做的那样,但我设法通过修改我的表单组成(虽然它看起来相同)来获得所需的行为, ExtJS 5.1能够有条不紊地跟随。

为了实现这一点,我删除了radiogroup组件,但保留了其中的所有内容(这几乎就是整个表单内容)。对于更新的框架来说,结构似乎并不自然。

Here is a fiddle所提到的更改。

在此处包含代码:

// The data store containing the list of states
var states = Ext.create('Ext.data.Store', {
    fields: ['abbr', 'name'],
    data : [
        {"abbr":"AL", "name":"Alabama"},
        {"abbr":"AK", "name":"Alaska"},
        {"abbr":"AZ", "name":"Arizona"}
    ]
});

Ext.application({
    name : 'Fiddle',

    launch : function() {
        Ext.create('Ext.form.Panel', {
            title: 'My Navigable Panel',  
            items: [

                {
                    xtype: 'radiofield',
                    boxLabel: 'My First Option',
                    name: 'radio',
                    value: true,
                    checked: true,
                    listeners: {
                        change: function(group, newValue, oldValue) {

                            if(newValue) {
                                group.up('form').down('fieldcontainer[name=containerA]').show();
                                group.up('form').down('fieldcontainer[name=containerB]').hide();
                            } else {
                                group.up('form').down('fieldcontainer[name=containerA]').hide();
                                group.up('form').down('fieldcontainer[name=containerB]').show();                                        
                            }
                        }
                    },
                },
                {
                    xtype: 'fieldcontainer',
                    layout: 'hbox',
                    name: 'containerA',                            
                    fieldDefaults: {
                        labelAlign: 'top',
                        margin: '0 5 0 5'
                    },
                    items: [
                        {
                            xtype: 'textfield',
                            fieldLabel: 'First field',
                            allowBlank: false
                        },
                        {
                            xtype: 'combo',
                            fieldLabel: 'State',
                            width: 50,
                            store : states,
                            queryMode: 'local',
                            displayField: 'name',
                            valueField: 'abbr',
                        },
                        {
                            xtype: 'button',
                            text: 'Next'
                        }
                    ]
                },
                {
                    xtype: 'radiofield',
                    boxLabel: 'My Second Option',
                    name: 'radio',
                    value: false                    
                },
                {
                    xtype: 'fieldcontainer',
                    padding: '0 0 0 25',
                    name: 'containerB',
                    hidden: true,
                    items: [{
                        xtype: 'radiogroup',
                        layout: 'vbox',
                        items: [
                            {
                                xtype: 'radiofield',
                                fieldLabel: 'My nested radio button A',
                                name: 'subradio'
                            },
                            {
                                xtype: 'radiofield',
                                fieldLabel: 'My nested radio button B',
                                name: 'subradio'
                            }
                        ]
                    }]
                }
            ],
            renderTo: Ext.getBody()
        }).show();
    }
});