2012-11-12 9 views
5

Ich habe eine Laden Methode, die Daten über eine Ajax-Anfrage zurückgibt. Ich kann sehen, dass die Daten zurückgegeben werden Firebug, aber mein Erfolg Handler wird nicht immer genannt:Extjs speichern Laden Erfolg Handler nicht gefeuert

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

ich einen Erfolgsparameter kehre zurück, zusammen mit den Daten:

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

Gibt es etwas, fehlt oder mache ich etwas falsch?

Antwort

20

Ich nehme an, Sie suchen dafür:

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'); 
     } 
    } 
}); 

Es ist nicht so offensichtlich in der API, dass Ihre zusätzlichen params auch dort platziert werden können. Aber ExtJS verwendet oft die Config-Objekte, um Dinge abzuschließen.

Kommentar bearbeiten zu beantworten:

Die kurze Antwort lautet: Ja

Nun ist die längere Version: Im Fall des Ladens es bis zu Ihnen (oder Beton direkt anonym liefern) Rückrufe oder Ereignisse registrieren. Beides wird in Ihrer Situation hier genauso funktionieren.

Aber Sie können nur einen Rückruf haben, während Sie viele Ereignisse haben können. In weiteren Szenarien finden Sie Situationen, in denen Ereignisse viel besser passen oder wo Ereignisse der einzige Weg sind. Das wird immer der Fall sein, wenn Sie zuhören. Hier sind einige Hinweise dazu:

  • Verwenden Sie die {single: true} -Eigenschaft, wenn Sie nur einmal einen Rückruf benötigen. Beispiel: store.on('load', function(s) { /* do something*/ }, scope, { single: true }) Der Listener wird nach dem Aufruf entfernt. Dies ist Grund für die Verwendung einer anonymen Funktion, die nicht entfernt werden kann.
  • Verwenden Sie mon() in den meisten Fällen, in denen Sie Listener direkt in Klassendefinitionen binden, um sicherzustellen, dass die Listener zusammen mit der Instanz der Klasse zerstört werden.

Beide sparen Sie Browserspeicher.

+0

nützliche zusätzliche Informationen, danke. Kann ich fragen, ob die Art, wie ich den Laden lade, korrekt ist? Ich lade 3 Speicher in den Controller, und diese Methode scheint eine automatisch generierte zu sein. Ich mache mich immer noch mit der Syntax vertraut - für mich scheint this.store.Categories.load() offensichtlicher zu sein, ist aber offensichtlich nicht der Fall! – BrynJ

+0

@BrynJ Nun, ich werde meinen Beitrag aktualisieren, um weitere Informationen zu Callbacks und Listenern zu erhalten. – sra

+0

Mir ist gerade aufgefallen, dass ich die Klammern auch falsch in meinen Code gesetzt habe - ich war mir ziemlich sicher, dass ich Callback auch als Property-Name für meinen Handler ausprobiert habe ... in diesem Fall hoffentlich funktioniert das :) – BrynJ

6

Versuchen Sie folgendes:

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 nach der docs gibt es keinen Erfolg und Fehler-Callback.

Eine weitere Alternative zum Rückruf können Sie auch einen "load" -Ereignislistener für denselben Effekt im Geschäft hinzufügen. Nun

+0

Danke für die Antwort. Kannst du vielleicht etwas mehr Kontext bereitstellen - der aktuelle Aufruf ist innerhalb einer Controller-Funktion ... Ich bin mir nicht sicher, wie dies implementiert werden würde? – BrynJ

+0

das gleiche wie Ihr "Erfolg" Block, nur "Rückruf" statt :) – dbrin

+0

Ah, ich sehe, ich werde das wieder versuchen – BrynJ