2013-04-09 3 views
1

Я должен обновить некоторые метки, которые берут данные из магазина. Я должен загрузить в хранилище новые данные для ex. каждые 10 секунд. Это легко - используйте setInternal() (потому что TaskRunner не работает o_0) _ и вызовите событие store.load. Но моя задача гораздо более конкретна. У меня также есть сетка, которая содержит два столбца и берет некоторые данные из хранилища, а некоторые данные являются обычными. Это означает, что перед столбцами с явным хранилищем dataindexes есть несколько новых записей в хранилище с пользовательскими строковыми данными и некоторыми числовыми данными ... Это может быть сложно объяснить словом, но в коде оно выглядит так:extjs 4 динамический магазин

//---Store--- 
Ext.define('App.store.Data', { 
    extend: 'Ext.data.Store', 
    autoLoad: false, 
    storeId:'Data', 
    model: 'App.model.DataModel', 
    proxy : { 
    type : 'ajax', 
    url: 'http://mybackend', 
    reader: { 
     type: 'json' 
    } 
    }, 
    data:[first = true], 
    listeners:{ 
     load: function() 
     { 
      if(first){ 
      first=false; 
      myApp.getController('App.controller.Controller').StoreLoadHandler(); 
      setInterval(function(){myApp.getController('App.controller.Controller').StoreLoadHandler();},10000); 
      } 

     } 
    } 
}); 
//---Controller--- 
StoreLoadHandler: function(){ 
    var store = this.getStore('Data'); 
    //upload data from base into store 
    store.reload(); 
    store.add(
      [ 
       { 
        fio: 'somedata', 
        //calculate some data and write it into store. All dataindexes are existsin model 
        operCount: parseInt(this.getStore('Data').first().get('isQuick')), 
        opersvod: (this.getStore('Data').first().get('opersvod')), 
        isQuick:parseInt(this.getStore('Data').first().get('isQuick')), 
        ipk: (this.getStore('Data').first().get('ipk')), 
        allCount: (this.getStore('Data').first().get('allCount')), 
        id: 0 
       }, 
       { 
        fio: 
        ... 
        id: 1 
       }, 
       { 
        fio: 
        ... 
        id: 2 
       }  
      ] 
     ); 



     //takes my labels and use setText, works brilliant 
    Ext.ComponentQuery.query('#TopPanel')[0].items.getAt(0).items.get('inW').setText(this.StoreCalc('iw')); 
    Ext.ComponentQuery.query('#TopPanel')[0].items.getAt(1).items.get('isClose').setText(this.StoreCalc('isClose')); 
    Ext.ComponentQuery.query('#TopPanel')[0].items.getAt(2).items.get('denied').setText(this.StoreCalc('denied')); 
    Ext.ComponentQuery.query('#BottomPanel')[0].items.getAt(0).items.get('allCount').setText(store.getAt(3).get('allCount')); 

    //use sort 
    store.sort([ 
    { 
     property : 'id', 
     direction: 'ASC' 
    }, 
    { 
     property : 'fio', 
     direction: 'ASK'//'DESC' 
    } 
    ]); 
    store.destroy(); 
    } 

В этом случае, когда я вызываю метод store.load() или store.reload(), мои пользовательские записи в магазине теряются. Если я удалю эту операцию из списка своих пользовательских данных, это сохранение и рендеринг в сетке с двумя столбцами (dataindexes - «fio» и «operCount») ... Где проблема?

ответ

1

Похоже, вы звоните add метод без данных в магазине. Используйте опцию обратного вызова из reload метода:

store.reload({callback: function() { 
      store.add(...); 
    } 
}) 

Примечание: не настроить таймер перезарядки от load метода - это плохо для понимания

+0

Спасибо! Я уже знал, где проблема, но мое решение было не таким изящным ... Я положил в reload() все другой код. Но теперь с вашей помощью я могу решить мою проблему лучше! – Iexpmhihx

Смежные вопросы