2010-02-10 18 views
7

In ExtJS, come carico un negozio quando visualizzo una griglia? Voglio che il negozio carichi solo quando viene visualizzata la griglia (l'utente fa clic su un pulsante per mostrare la griglia, quindi è inutile caricare in anticipo il negozio). Ho provato il listener afterrender ma esegue il rendering della maschera di carico nella posizione errata e il listener afterlayout ricarica la griglia ogni volta che la griglia viene ridimensionata.In ExtJS, come carico un negozio quando visualizzo una griglia?

risposta

13

Questa è una di quelle cose che può essere un po 'difficile da realizzare perché stavano dando al browser troppo da fare in una volta (particolarmente evidente in IE).

Mi piace utilizzare una combinazione di differimento per consentire al browser di recuperare il tempo necessario a eseguire correttamente il rendering.

var grid = new Ext.grid.GridPanel({ 
    ..., 
    listeners : { 
     render : function(grid){  
      grid.body.mask('Loading...'); 
      var store = grid.getStore(); 
      store.load.defer(100, store); 
     }, 
     delay: 200 
    } 
}); 

Giocare con il valore di ritardo/rinvio dovrebbe fornire i risultati desiderati. Il periodo di tempo necessario per ritardare/rinviare dipende dalla complessità della tua griglia e dalla velocità del browser.

Ricordarsi inoltre di rimuovere la maschera al termine del caricamento del negozio.

listeners: { 
    load: function(){ 
     yourGrid.body.unmask(); 
    } 
} 

NOTA: A pochi chiarimenti alla risposta da Lloyd - non è necessario impostare autoLoad false, perché questo è il valore di default (cioè: non impostare affatto) e suona come da la tua descrizione che vorresti utilizzare il metodo di caricamento dei negozi, invece di ricaricare.

+0

Questo è un buon approccio, anche se applicherei il mascheramento solo se trovi che ne hai effettivamente bisogno. Se carica troppo velocemente, la maschera potrebbe apparire come uno sfarfallio. Inoltre, assicurati di smascherare il gestore dell'evento di caricamento del negozio. L'esempio di combinazione del browser di layout "Schede con layout annidati" utilizza questo metodo di rendering del caricamento del negozio nella sua griglia interna: http://www.extjs.com/deploy/dev/examples/layout-browser/layout-browser.html –

+0

Sono d'accordo con i commenti di Brian - dimentica di farlo se i tuoi dati tornano in meno di ~ 5 secondi. L'utente non lo noterà mai. Aggiunto un bocconcino sulla rimozione della maschera, grazie. –

+0

Bello. Mi chiedo, a cosa serve "delay: 200"? È necessario? – Gugan

0

È possibile impostare autoLoad su false per il negozio e chiamare semplicemente store.reload(); quando l'utente fa clic sul pulsante per mostrare la griglia.

+2

Questo funziona, ma significa che la rete non è responsabile del proprio negozio. Va bene se si condivide un negozio su più componenti, ma per una singola griglia, preferirei che la rete fosse responsabile del caricamento del negozio. –

2

Hai considerato la gestione dell'evento activate? È possibile aggiungere un gestore eventi che carica i dati sull'evento activate e quindi rimuove sé stesso.

this.on('activate', function(){ 
this.un('activate', arguments.callee); 
    this.store.load(); 
}, this); 

Qui this si riferisce a GridPanel.

Problemi correlati