2011-05-25 3 views
2

Ceci est du code oldish mais de toute façon ...Ext JS question de la portée

Je suis en train de filtrer un magasin, et écouter l'événement dans un comboBox, donc je peux rafraîchir. Mon événement doQuery travail na pas, (en réalité, il a fait le travail, mais il est revenu des ensembles de résultats aléatoires, ce qui laisse un sentiment général de wtf)

config.store.filterBy(function Filter(record){ 
    //this works 
     if (record.data.field != ""){ 
      return true; 
     } 
     else {return false;} 
    }); 

Toutefois, cela ne met pas à jour automagiquement le combobox. J'ai donc essayé différentes versions de

cbx = new Ext.getCmp(this);  
    debugger; //scope right here  
    this.getStore().on("datachanged",function refresh(){ 
     cbx.reset();// store's scope 
    }); 

Mais la portée de cbx semble toujours être le magasin, au lieu du combobox.

Quelqu'un at-il une idée de comment ajouter un écouteur pour l'événement de changement de données dans un magasin à un comboBox?

Répondre

2

La portée par défaut d'un rappel d'événement est l'objet qui a déclenché l'événement. Dans ce cas, ce serait le magasin. Le troisième paramètre de la méthode on() vous permet de remplacer la portée. Réglez le troisième paramètre à this et votre bon à faire.

De la documentation (3.x et 4.x):

on(String eventName, Function handler, [Object scope], [Object options]) 

donc quelque chose comme ça devrait faire l'affaire:

this.getStore().on("datachanged", function refresh() { 
    cbx = Ext.getCmp(this); 
    cbx.reset(); 
}, this); // <-- Provide scope for the callback function 
0

Vous pouvez toujours définir la portée d'une fonction dans ExtJS (je suppose que vous utilisez ExtJS 3.x) avec Function.createDelegate.

this.getStore().on("datachanged",function() { 
    cbx.reset(); 
}).createDelegate(this); 

Bien que de l'échantillon de code que vous avez fourni, je ne suis pas sûr de ce que le problème est depuis cbx.reset() ne devrait pas avoir de problèmes de portée.