2017-04-19 1 views
1

J'ai un magasin proxy qui remplit de deux manières différentes - soit via loadData, ou via load.Événement qui se déclenche une fois que le magasin a des données

J'ai certaines actions qui devraient avoir lieu une fois le magasin rempli; à savoir un certain enregistrement doit être recherché et sélectionné:

preselectByName:function(name, groupName) { 
    var store = this; 
    if(store.preselected) return; 
    store.preselected = true; 
    store.on('load',function() { 
     store.selectByName(name, groupName); 
     store.preselected = false; 
    },store,{single:true}); 
} 

appelé comme ceci:

if(store.isLoaded) store.selectByName(name, groupName); 
else store.preselectByName(name, groupName); 

Ce code fonctionne très bien si le magasin se remplit par load, mais pas par loadData.

  • Y at-il un autre événement qui est tiré à la fois load et loadRecord?
  • Sinon, comment pourrais-je implémenter un écouteur qui se déclenche sur l'un des deux événements, selon la première éventualité?

Répondre

1

La charge L'événement est spécifiquement destiné à la lecture de données provenant d'une source de données distante. Le magasin peut être étendu pour présenter un événement qui répond à vos besoins.

/* 
    @event loadrecords Fires whenever records a loaded into the store. 
     @param {Ext.data.Model[]} records An array of records 
*/ 
Ext.define('MyApp.data.Store', { 
    extend: 'Ext.data.Store', 

    load: function() { 
     this.callParent(arguments); 
     this.fireLoadRecords(); 
     return this; 
    }, 

    fireLoadRecords: function() { 
     this.fireEvent('loadrecords', this.getRange()); 
    }, 

    loadRecords: function(records, options) { 
     this.callParent(arguments); 
     this.fireLoadRecords(); 
    } 
}); 

http://docs.sencha.com/extjs/6.2.0/classic/Ext.data.ProxyStore.html#event-load

1

est un événement, qui se déclenche à la fois load et loadRecord, mais attention, il tire de tout changement qui a fait l'ensemble de données.

En plus: je l'habitude d'utiliser ceci pour trouver l'événement dont j'ai besoin ExtJs:

Ext.util.Observable.capture(myObj, function(evname) {console.log(evname, arguments);}) 

Il capture tous les événements ExtJs, tirés par le composant myObj et les journaux à la console.

  • Ou vous pouvez créer un événement personnalisé, qui vous le feu manuellement sur load et après loadData, comme:

store.on ("charge", function() {store.fireEvent ("myload")})

et

store.loadData (...)

store.fireEvent ("myload")

puis

store.on ("myload", function() {...})

+0

Oui, il peut être un problème que 'datachanged' incendies trop souvent.Je vais vérifier cela; mais puisque les enregistrements dans le magasin peuvent être édités dans des formes, et je veux seulement lancer sur 'load' ou' loadData', je ne suis pas sûr que c'est la voie à suivre. – Alexander

+0

Peut-être que vous pourriez essayer quelque chose: au lieu de 'loadData()', vous pouvez essayer de remplacer le proxy par un proxy mémoire, définir la propriété 'data' sur les données requises, puis charger()', et enfin l'événement load remplace le proxy par rapport à l'original. Je n'ai pas testé cela, juste une idée. Peut-être un peu grincheux. –