Extjs Combo - 为啥在我没有创建表单时加载组合包含组合

Posted

技术标签:

【中文标题】Extjs Combo - 为啥在我没有创建表单时加载组合包含组合【英文标题】:Extjs Combo - Why combo is loading while I have not created form include comboExtjs Combo - 为什么在我没有创建表单时加载组合包含组合 【发布时间】:2013-07-09 09:19:30 【问题描述】:

我定义了一个窗口,包括一个表单和一些字段和组合框。比如

    Ext.define('Ext.example.ABC', 
        extend: 'Ext.window.Window',   
        items:
            xtype:'form',
            items:[
            
            xtype: 'combo',
            id: 'example',
            name: 'ax',
            triggerAction:  'all',
            forceSelection: true,
            editable:       false,
            allowBlank: false,
            fieldLabel:     'example',
            mode: 'remote',
            displayField:'name',
            valueField: 'id',
            store: Ext.create('Ext.data.Store', 
                            fields: [
                                name: 'id',
                                name: 'name'
                            ],
                            autoLoad: true,
                            proxy: 
                                type: 'ajax',
                                url: 'example.php',
                                reader: 
                                    type: 'json',
                                    root: 'rows'
                                
                            
                
            )
            ]
         
         ,load: function(a) 
              // do some thing
         
);

我在 网格面板中有一个按钮

tbar:[
            
            text:'create',
            handler:function()
                         var x = new Ext.example.ABC();
                 x.load(0);

            
        

但是为什么当我刚刚启动 gridpanel 然后组合也加载而我没有点击按钮 create。 我有很多组合框,这使我的网格面板加载缓慢:( 怎么解决呢,谢谢

【问题讨论】:

【参考方案1】:

我猜你需要为组合框的store 设置autoLoad: false 配置选项。


关于您的 cmets - 我创建了一个示例。你可以在jsFiddle查看。 它是在 ExtJs 3.4 上创建的,但我认为对于 4.x,它不会有太大的不同。

var arrTestData = [
    ['AL', 'Alabama', 'The Heart of Dixie'],
    ['AK', 'Alaska', 'The Land of the Midnight Sun'],
    ['AZ', 'Arizona', 'The Grand Canyon State'],
    ['AR', 'Arkansas', 'The Natural State'],
    ['CA', 'California', 'The Golden State']
];

var combosCount = 5;
var arrItems = [];
for (var i = 0; i < combosCount; i++) 
    var comboId = Ext.id();

    // simple array store
    var store = new Ext.data.ArrayStore(
        parentCombo: comboId,
        fields: ['abbr', 'state', 'nick'],
        data : []
    );

    store.on('load', function() 
        var combo = Ext.getCmp(this.parentCombo);
        combo.setValue(combo.defaultValue);
    );

    var combo = new Ext.form.ComboBox(
        id: comboId,
        fieldLabel: 'Combobox #' + (i + 1),
        store: store,
        displayField:'state',
        valueField:'abbr',
        typeAhead: true,
        mode: 'local',
        forceSelection: true,
        triggerAction: 'all',
        emptyText:'Select a state...',
        defaultValue: arrTestData[i][0],
        selectOnFocus:true
    );
    arrItems.push(combo);


var formPanel = new Ext.form.FormPanel(
    bodyStyle: 'padding:5px;',
    items: arrItems,
    renderTo: 'combos-container'
);


new Ext.Button(
    text: 'Do all cool things',
    renderTo: 'combos-btn',
    handler: function() 
        var arrCombos = formPanel.findByType('combo');
        Ext.each(arrCombos, function(combo)
            combo.getStore().loadData(arrTestData);
        );
    
);

所以我们在那里做什么: 1. 对于每个商店,我们将保存父组合框 ID - 这是识别相关组合框所必需的。 2. 对于每个组合框,我们保存自己的参数 - defaultValue。这是我们希望在加载商店后设置为默认值。 3. 监听'load'事件并为combo设置默认值。

我希望这就是你所等待的:)

【讨论】:

但是我想设置一个默认值如果设置 autoLoad: false 那么什么都没有:( 您可以使用value 配置选项设置组合框的默认值。那时,商店必须拥有所有必需的数据。我认为您需要手动运行存储加载以及何时接收数据-> 为组合设置值。 你有什么例子吗? b/c 我有很多组合框(大约 5 个):( 我觉得你的编辑很酷,但我使用 url 来获取数据。你可以让一个对话框等待所有组合加载完成吗? .非常感谢 我不确定出了什么问题。我们分别将数据加载到组合框。例如。您可以使用autoload + 真实网址。对于每个商店,我们都会监听load 事件,这意味着我们将仅在接收到数据时运行我们的代码。如果您不想自动加载组合框 -> 将 autoLoad 设置为 false 为组合框的每个商店。并在需要时运行store.reload()【参考方案2】:

拥有autoLoad:false 并手动加载您的商店以获取默认值。 当你真的想加载商店时,你可以这样做

store.load()

它将加载您的商店以获取默认值。

【讨论】:

但是我的所有商店(组合)加载完成后还是要赶上?我有很多组合(一些组合可能是动态的):( 参考link

以上是关于Extjs Combo - 为啥在我没有创建表单时加载组合包含组合的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS Combo 默认值返回 null

Extjs Combo - 如何使用 GetForm().load 将值加载到组合

extjs组合显示值

EXTJS 5:为啥 Ext.grid.Panel 没有 stripRows 效果,在我将主题从 Neptune 更改为清晰之后

Extjs 4.1 Combo - 查找记录功能失败

ExtJs中Combo组件默认选中