Domanda

Ho un'applicazione basata su ExtJS. Quando si modifica un oggetto, viene visualizzata una finestra ExtJS con un numero di schede. Tre di queste schede hanno Ext GridPanels, ognuna delle quali mostra un diverso tipo di dati. Attualmente ogni GridPanel ha il proprio JsonStore, il che significa quattro richieste AJAX totali al server: una per il javascript per creare la finestra e una per ciascuno dei JsonStore. Esiste un modo in cui tutti e tre i JsonStore possano leggere da una chiamata AJAX? Posso facilmente combinare tutti i dati JSON, ognuno attualmente ha una diversa proprietà root .

Modifica : si tratta di Ext 2.2, non di Ext 3.

È stato utile?

Soluzione

L'oggetto javascript creato dalla risposta JSON è disponibile in yourStore.reader.jsonData quando viene attivato l'evento load del negozio. Ad esempio:

yourStore.on('load', function(firstStore) {
   var data = firstStore.reader.jsonData;
   otherStore.loadData(data);
   thirdStore.loadData(data);
}

EDIT: Per chiarire, ogni negozio avrebbe bisogno di una proprietà root separata (cosa che stai già facendo) in modo che ognuno ottenga i dati previsti.

{
   "firstRoot": [...],
   "secondRoot": [...],
   "thirdRoot": [...]
}

Altri suggerimenti

È possibile ottenere JSON direttamente con un AjaxRequest e quindi passarlo al metodo loadData () di ciascun JSONStore.

Potresti essere in grado di farlo utilizzando Ext.Direct, dove puoi effettuare più richieste durante una singola connessione.

Forse la memorizzazione nella cache HTTP può aiutarti. Combina i tuoi dati json, assicurati che i tuoi JsonStore stiano utilizzando GET e guarda Firebug per accertarti che la seconda e la terza richiesta non vadano sul server. Potrebbe essere necessario impostare un'intestazione di scadenza molto futura in quella risposta json, che potrebbe non essere utile se si prevede che i dati cambino spesso.

Un altro modo fantastico è usare Ext.Data.Connection () come mostrato di seguito:

var conn = new Ext.data.Connection();
    conn.request({
        url: '/myserver/allInOneAjaxCall',
        method: 'POST',
        params: {
           // if you wish too
        },
        success: function(responseObj) {
            var json = Ext.decode(responseObj.responseText);

           yourStore1.loadData(json.dataForStore1);
           yourStore2.loadData(json.dataForStore2);            

        },
        failure: function(responseObj) {
            var message = Ext.decode(responseObj.responseText).message;
            alert(message);

        }
    });

Ha funzionato per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top