2012-11-12 10 views
5

Ho un metodo di caricamento del negozio che restituisce i dati tramite una richiesta Ajax. Vedo che i dati vengono restituiti utilizzando Firebug, ma il mio gestore di successo non è sempre chiamato:Il gestore di successo del caricamento del file Extjs non viene licenziato

this.getCategoriesStore().load({params:{'id':d.data.category_id}}, { 
     success: function(category) { 
      console.log("Category: " + category.get('name')); 
     }, 
     error: function(e) { 
      console.log(e); 
     } 
    }); 

torno un parametro di successo, insieme ai dati:

{"success":true,"categories":{"id":5,"name":"Frying","section_id":2}} 

c'è qualcosa manca o sto facendo qualcosa di sbagliato?

risposta

20

Beh, suppongo siete alla ricerca di questo:

store.load({ 
    params:{'id':d.data.category_id}, 
    scope: this, 
    callback: function(records, operation, success) { 
     if (success) { 
      console.log("Category: " + category.get('name')); 
     } else { 
      console.log('error'); 
     } 
    } 
}); 

Non è che evidente nel API che i params aggiuntivi possono essere posizionati anche lì. Ma ExtJS spesso usa gli oggetti config per avvolgere le cose.

Edit per rispondere a un commento:

La risposta breve è: Si

Ora la versione più lunga: Nel caso del negozio spetta a voi per fornire direttamente anonima (o cemento) richiamate o registrati eventi. Entrambi funzioneranno allo stesso modo nella tua situazione qui.

Ma è possibile avere solo una richiamata mentre è possibile avere molti eventi. In altri scenari troverai situazioni in cui gli eventi si adattano meglio o dove gli eventi sono l'unico modo. Questo sarà sempre il caso quando ascolti. Di seguito alcune note:

  • utilizzare la proprietà {single: true} quando è necessaria una sola richiamata. Esempio: store.on('load', function(s) { /* do something*/ }, scope, { single: true }) Il listener verrà rimosso dopo la chiamata. Ciò è necessario a causa dell'uso di una funzione anonima, che non può essere rimossa.
  • fare uso di mon() nella maggior parte dei casi in cui si vincolano gli ascoltatori direttamente nelle definizioni di classe per garantire che gli ascoltatori vengano distrutti insieme all'istanza della classe.

Entrambi ti salveranno la memoria del browser.

+0

utili informazioni extra, grazie. Posso chiederti se il modo in cui sto caricando il negozio è corretto? Sto caricando 3 negozi nel controller e questo metodo sembra essere uno generato automaticamente. Sto ancora familiarizzando con la sintassi - per me, this.store.Categories.load() sembrerebbe più ovvio, ma ovviamente non è il caso! – BrynJ

+0

@BrynJ Bene aggiornerò il mio post per fornire ulteriori informazioni su callback e listener. – sra

+0

Ho notato che ho inserito le parentesi errate nel mio codice anche - ero abbastanza certo che avrei anche provato il callback come nome della proprietà per il mio gestore ... in tal caso spero che funzionerà :) – BrynJ

6

Prova questo:

store.load({ 
    scope: this, 
    callback: function(records, operation, success) { 
     // the operation object 
     // contains all of the details of the load operation 
     console.log(records); 
    } 
}); 

http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.Store-method-load Secondo la documentazione non è successo e l'errore di callback.

Un'altra alternativa al callback è la possibilità di aggiungere un listener di eventi "load" sull'archivio per lo stesso effetto.

+0

Grazie per la risposta. Puoi fornire qualche altro contesto: la chiamata corrente è all'interno di una funzione di controller ... Non sono sicuro di come verrà implementato? – BrynJ

+0

uguale al tuo blocco "successo", solo "callback" invece :) – dbrin

+0

Ah, vedo, ci riproverò ancora – BrynJ