2016-09-21 144 views
0

我有一個簡單的組合框內的內聯商店。該商店有一些默認的內聯數據。現在我正在尋找一個事件,一旦創建商店就會被解僱,並且此事件需要向我提供商店中的數據。ExtJs:獲取商店創建的商店數據

我想它是這樣的:

Ext.create('Ext.form.ComboBox', { 
    fieldLabel: 'Choose', 
    store: { 
     autoLoad: true, 
     fields: [ 
      {name: 'name', type: 'string'} 
     ], 
     data : [ 
      {"name":"TestName_A"}, 
      {"name":"TestName_B"}, 
      {"name":"TestName_C"}, 
     ], 
     listeners: { 
      load: function(store) { 
       let records = store.getData() 
       records.forEach(record => { 
        console.log(record.getField('name')) 
       }) 
      } 
     } 
    }, 
    queryMode: 'local', 
    valueField: 'name', 
    displayField: 'name', 
    renderTo: Ext.getBody() 
}); 

但它不工作。 store.getData()似乎沒有包含我的記錄。

有我的小提琴: https://fiddle.sencha.com/?fiddle=v7#fiddle/1h53

+0

更改您的加載代碼()函數來store.getData()項目收到您的記錄。 – xdn

+0

它返回一個空數組,一段時間之後,空突然包含3個構造函數。跆拳道? https://fiddle.sencha.com/?fiddle=v7#fiddle/1h74(當調試器斷點被擊中時,數組是空的,一旦你恢復執行,它包含一個構造函數數組。) – Forivin

+0

如果你想迭代商店記錄,使用'store.each'。 'getField'也會返回一個字段配置,你可能需要'get'。 –

回答

0

使用此店現在顯示控制檯數據:

Ext.create('Ext.form.ComboBox', { 
    fieldLabel: 'Choose', 
    queryMode: 'local', 
    valueField: 'name', 
    displayField: 'name', 
    renderTo: Ext.getBody(), 
    listeners: { 
     afterrender: function(me) { 

      var store = Ext.create('Ext.data.Store', { 
       //autoLoad: true, 
       fields: [ 
        {name: 'name', type: 'string'} 
       ], 
       data : [ 
        {"name":"TestName_A"}, 
        {"name":"TestName_B"}, 
        {"name":"TestName_C"}, 
       ], 
       listeners: { 
        datachanged : function(store) { 
         Ext.each(store.data.items,function(rec){ 
          console.log(rec.data.name); 
         }); 
        } 
       } 
      }); 
      me.setStore(store); 
      store.load(); 
     } 
    }, 
}); 
0

我終於通過訪問商店來解決這個問題它的組合框之後被渲染: https://fiddle.sencha.com/?fiddle=v7#fiddle/1h7c

Ext.create('Ext.form.ComboBox', { 
    fieldLabel: 'Choose', 
    store: { 
     autoLoad: true, 
     fields: [ 
      {name: 'name', type: 'string'} 
     ], 
     data : [ 
      {"name":"TestName_A"}, 
      {"name":"TestName_B"}, 
      {"name":"TestName_C"}, 
     ], 
    }, 
    queryMode: 'local', 
    valueField: 'name', 
    displayField: 'name', 
    renderTo: Ext.getBody(), 
    listeners: { 
     afterrender: function(me) { 
      let store = me.getStore() 
      console.log("Event fired!") 
      store.each(record => { 
       console.log(record.get('name')) 
      }) 
     } 
    }, 
}); 
0

你可以很容易地通過一個AfterRender的創造店做組合框並將商店設置爲組合框。

 
Ext.create('Ext.form.ComboBox', { 
    fieldLabel: 'Choose', 
    queryMode: 'local', 
    valueField: 'name', 
    displayField: 'name', 
    renderTo: Ext.getBody(), 
    listeners: { 
     afterrender: function(me) { 

      var store = Ext.create('Ext.data.Store', { 
       autoLoad: true, 
       fields: [ 
        {name: 'name', type: 'string'} 
       ], 
       data : [ 
        {"name":"TestName_A"}, 
        {"name":"TestName_B"}, 
        {"name":"TestName_C"}, 
       ], 
       listeners: { 
        load: function(store) { 
         Ext.each(store.data.items,function(rec){ 
          console.log(rec.data.name); 
         }); 
        } 
       } 
      }); 
      me.setStore(store); 
     } 
    }, 
}); 
+0

這是行不通的。什麼都不會打印到控制檯。 – Forivin

+0

這是因爲使用代理時,存儲負載正在工作。在你的情況下,商店數據是靜態的。這就是沒有調用加載函數的原因。 –

+0

只是評論autoLoad:true;在me.setStore(store)後添加store.load(); –