web-dev-qa-db-fra.com

Rechargement d'un magasin json avec de nouveaux paramètres ExtJs Ext.data.JsonStore

J'ai actuellement du mal à recharger une boutique json avec de nouveaux paramètres. Voici ma boutique:

 newsletters = new Ext.data.JsonStore({
        url: '/newsletters/',
        root: 'results',
        fields: [
             'id',
             'body'
             'recipients'
        ],
        baseParams: { command: 'json', to: dateTo, from: dateFrom },
    autoLoad: true
    });

dateTo et dateFrom sont initialement des chaînes vides ('') et l'archivage de firebug/newsletters est appelé avec les paramètres corrects.

Maintenant, aucun des travaux les plus techniques suivants:

Changer les valeurs de dateTo et dateFrom puis appeler newsletters.reload () appelle toujours la page avec les paramètres vers et depuis des chaînes vides.

L'appel de newsletters.reload( { to: 'test1', from: 'test2' } ); considère toujours les paramètres comme des chaînes vides.

Enfin à partir du manuel j'ai essayé:

lastOptions = newsletters.lastOptions;
Ext.apply(lastOptions.params, {
    to: 'test1',
    from: 'test2'
});
newsletters.reload(lastOptions);

Encore une fois, cela ne demande pas/newsletters avec les paramètres mis à jour.

Tout conseil apprécié!

27
babadbee

Vous pouvez réellement passer un objet params à la méthode load ()

newsletters.load({
  params: {to: 'test1', from: 'test2'}
})
29
Mchl

À partir des documents, vous pouvez probablement faire:

store.setBaseParam('to', dateTo);

Maintenant, si je comprends bien, vous voulez que vos baseParams soient modifiés chaque fois que dateTo et dateFrom sont modifiés.

Tu pourrais essayer :

var dateTo = '', dateFrom = '';

store.on('beforeload', function(s) {
    s.setBaseParam('to', dateTo);
    s.setBaseParam('from', dateFrom);
});

// This should work :
dateTo = 1;
dateFrom = 2;
store.load();
5
Drasill

Mon problème était: j'ai un magasin qui doit demander des données via un proxy au back-end. Cette demande doit contenir un paramètre nommé filter, qui aidera simplement le serveur principal à décider quel est l'ensemble de résultats qui intéresse le client. Ce paramètre est chargé à partir d'un Combobox ou d'un autre composant que l'utilisateur peut utiliser pour exprimer quel filtre doit être utilisé.

De mon point de vue, les paramètres ne doivent pas être définis sur Store et ni utiliser le paramètre de chargement. Je vais vous expliquer pourquoi:

  1. La configuration des paramètres du magasin impliquerait que tous les autres composants utilisant le même magasin auront ces paramètres configurés, ce qui signifie que vous pouvez avoir des problèmes de concurrence.
  2. Et dans le second cas, il n'est pas intéressant de l'avoir configurable sur la méthode de charge, car vous ne voulez pas à chaque fois utiliser explicitement la méthode load par vous-même, rappelez-vous qu'il existe déjà certains composants comme la pagination et les composants personnalisés qui déclenchent cette méthode.

Quelle serait la bonne façon de mon point de vue:

Chaque fois qu'un load est déclenché, nous attachons simplement le paramètre supplémentaire de manière non intrusive. Cela signifie que le déclencheur n'aura besoin d'aucune modification (rappelez-vous ici que le déclencheur peut être n'importe quel composant qui exécute store.load()) et le magasin ne doit pas être au courant de ce nouveau paramètre.

Vous pouvez voir ici clairement que ce sera une opération effectuée avant de demander des données au proxy, et dans mon cas, j'ai implémenté un écouteur pour l'événement beforeload. Lorsque beforeload est exécuté, j'agrège simplement les nouveaux paramètres au paramètre de fonctionnement de l'écouteur qui selon documentation est: beforeload( store, operation, eOpts ). L'implémentation finale est quelque chose comme:

store.on({
    beforeload: function (store, operation, opts) {
        Ext.apply(operation, {
            params: {
                filterName: Ext.getCmp('filterCombo').getValue()
            }
       });
    }
});
4
Francisco Spaeth