2013-07-09 56 views
0

我定義了一個窗口包括窗體和一些字段和組合框。例如像Extjs組合 - 爲什麼組合框正在加載,而我還沒有創建窗體包括組合

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再組合,而我還沒有點擊按鈕創建還加載。
我有許多組合框,使我的網格面板加載緩慢:(
我該如何解決,多虧

回答

2

我想你需要爲你的組合框的store


在組autoLoad: false配置選項關於您的意見 - 我創建了一個例子,您可以檢查它jsFiddle
它在ExtJS的3.4創建的,但我認爲4.x的將是沒有太大的不同

。 10
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'事件併爲組合設置默認值。

我希望這是你在等什麼:)

+0

但我想設置一個默認值如果設置autoLoad:false然後沒有:( – freestyle

+0

你可以通過使用'value' config選項來設置組合框的默認值,那時商店必須有所有需要的數據,我認爲你需要運行手動存儲加載,當它將接收數據 - >設置值的組合。 – Andron

+0

你有任何例子嗎?b/ci有很多組合框(約5):( – freestyle

0

autoLoad:false和手動加載您的商店的默認值。 當你真正要加載的商店,你可以做

store.load() 

這將加載您的商店的默認值。

+0

但是,無論如何,當我所有的商店(組合)加載完成時趕上?我有很多組合(一些組合可能是動態的):( – freestyle

+0

請參閱[鏈接](http://stackoverflow.com/questions/11003605/how-to-wait-until-all-stores-are-loaded-in-extjs) –