10
votes

Comment envoyer des paramètres supplémentaires lors du chargement d'un magasin sur une combinaison de ComboBox dans ExtJS 4?

Comment puis-je envoyer des paramètres supplémentaires lors de l'utilisation d'un magasin pour une combinaison de ComboBox dans EXTJS 4?

Je sais que je peux utiliser des "extraparammes" dans les paramètres de proxy, mais cela affectera tous les éléments qui utilisent le même magasin . P>

IE Si j'ai une grille qui utilise un magasin appelé "Utilisateurs" qui répertoriera tous les utilisateurs d'un système. Dans le même temps, j'ai un ComboBox, qui utilise également le magasin "Utilisateurs", mais cette fois, je veux répertorier tous les utilisateurs "Status = 2", je veux ainsi envoyer le param "& statut = 2" sur le Ajax appelle à l'arrière-plan. P>

Si j'utilise quelque chose comme: p> xxx pré>

Ça fonctionnera, mais la grille sera à jour en même temps utiliser également "& status = 2". Je veux seulement que le ComboBox utilise le param. P>

Je suppose que je pouvais désactiver "AutoUpdate" sur la grille, puis régler les "Extraparams" sur l'événement "Render" sur le ComboBox, puis non définissez quand La Combobox est cachée, mais quelle serait une solution très laide. p>

Je peux également dupliquer le magasin à un "utilisateurs2" et utiliser celui-ci pour la combinaison, mais c'est une solution laid aussi.

Quelle est la bonne façon de faire cela? Ce doit être une chose très courante pour la plupart des gens. P>

Mise à jour 1: p>

Je sais que je peux utiliser quelque chose comme: p> xxx pré>

Mais comment j'utiliserais cela dans ExtJS 4 MVC? Là, je spécifie simplement "Store: utilisateurs" dans le formulaire-objet. Comment j'enverrais ces paramètres supplémentaires à la fonction ?LoDr ()? P>

J'ai essayé ce qui suit: p> xxx pré>

Cependant, il donne une erreur "non capturée TypeError: impossible de lire la propriété 'Serversip' de non défini " p>

mais le nom est correct: p> xxx pré>

aussi, où voudrais-je mettre l'auditeur? Je suppose que je n'ai pas obtenu celui-là correct dans mon exemple non plus que? P>

Mise à jour 2: p>

J'ai un peu plus loin à une solution maintenant: p>

store: Ext.create('Cloud.store.ServersIP', {
aaa: 'bbb'
}),


1 commentaires

Ajouter un auditeur Beforeload au magasin


5 Réponses :


1
votes

Vous pouvez définir AutoLoad code> sur false sur votre magasin, puis appelez le charger code> Méthode vous-même et utilisez-le paramiques code> option: xxx pré>

qui fonctionnera Si vous avez besoin de votre combo pour charger une seule fois, puis interroger en mode local. Si vous avez besoin de votre combo pour effectuer plusieurs appels sur le serveur (mode distant), définissez vos paramètres dans le Beforeload code> événement du magasin: p>

comboStore.on('beforeload', function(store, operation) {
    operation.params = operation.params || {};
    operation.params.status = 2;
});


5 commentaires

Votre exemple n'utilise pas MVC qui est utilisé dans EXTJS 4. Comment puis-je spécifier ces paramètres de charge en MVC? Là je viens de définir "Store: utilisateurs" sur le formulaire-objet.


En outre, la grille utilise le même magasin. Mettre le magasin à "AutoLoad = False" me forcera à charger manuellement le magasin dans tous les endroits où le magasin est utilisé. J'utilise ce magasin dans de nombreux endroits de mon application.


L'utilisation de la même instance de magasin pour la grille et le combo mendie des problèmes. Lorsque votre combo filtrera son magasin afin d'appliquer sa requête, qui filtrera également votre grille. Ce n'est probablement pas ce que vous voulez. Vous devez fournir au combo avec son propre magasin en fournissant une configuration avec xtype ou xclass .


Oui, c'est comme ça que je l'ai maintenant, mais je pense que c'est une solution laide. Je préférerais pouvoir utiliser un magasin générique, puis appliquer des paramètres en fonction de l'objet utilise le magasin. Comme la grille voudrait vouloir "& Statut = 1 & Clean = 1" et le ComboBox pourrait vouloir "& Status = 2 & Clean = 0". Jolie merde que ExtJS ne supporte pas cela par défaut. Tout ce qui serait nécessaire, c'est être capable de mettre les "paramètres" directement sur l'objet qui utilise le magasin.


Il y a un autre problème que vous négligez et c'est une liaison de données à des vues. Si vous modifiez l'instance de même magasin dans une vue, l'autre vue changera avec elle conduisant à des problèmes inattendus étranges.



2
votes

Au lieu de référencer le même magasin que la grille, vous pouvez créer une nouvelle instance du même magasin. De cette façon, les deux cas de magasin sont gérés séparément.

Donc, dans votre formulaire, remplacez Store: 'Utilisateurs' avec Store: nouveau myapp.store.utilisateur () , puis vous pouvez utiliser quelle méthode fonctionne mieux pour vous ( extraparammes, charge avec des paramètres, beforeload Listiers, etc.)


2 commentaires

Cela semble exactement ce que je veux. Cependant, je ne peux pas le faire fonctionner. J'ai mis à jour ma question.


Oui peut confirmer cela ne fonctionne pas. Essayé depuis 3 jours ... pas de chance c'est un bogue extjs avec des filtres et des magasins. Vous ne pouvez même pas faire les paramètres supplémentaires comme le résultat.



1
votes

C'est le meilleur code que je pourrais proposer. Aucun auditeur n'est nécessaire :)

Créer une nouvelle instance des "utilisateurs" -Store et modifier les params de celui-ci. P>

xtype: 'combobox',
fieldLabel: 'Users',
name: 'users',

store: (function() {
  var s = Ext.create('MyApp.store.Users');
  s.proxy.extraParams = {
    active: '1'
  }
  return s;
})(),


2 commentaires

Le proxy est partagé entre toutes les instances d'une classe de magasins (et le modèle associé), afin de définir des extraparams pour toutes les instances de myapp.store.utilisateurs ...


Mon résultat de test montre qu'il a défini des extraparams pour toutes les instances de MyApp.Store.utilisateurs.



9
votes

Je viens de résoudre ce problème. COMBOBOX QueryMode: Télécommande avec des paramètres supplémentaires.

Il suffit d'instancier le magasin dans "Vue" forte> Intérieur initcomponent fort> et remplacer le proxy p>

//set combobox store

{
    xtype: 'combobox',
    queryMode:'remote',
    store : Ext.data.StoreManager.lookup('YourStoreId'),
    ...
    ...
}


0 commentaires

2
votes

Vous pouvez attraper l'événement «Beforeload» et modifier l'opération de charge actuelle. De cette façon, les paramètres ne persisteront pas d'autres demandes.

Ext.create('Ext.data.Store', {
    model: MyModel,
    autoLoad: true,
    listeners:{
        // Fires before a request is made. op is an Ext.data.Operation object
        beforeload:function(store,op){ 
            // Set request parameters (without overriding other parameters)
            op.params = Ext.apply(op.params||{},{
                someParam:true
            });
        }
    }
});


2 commentaires

Contributeur ici: Veuillez fournir une brève description de la façon dont votre code fonctionne pour aider l'Asker Comprendre mieux.


@Thezver, in ext JS 6.0.1 Je devais le mettre à jour un peu: op.setparams (ext.Apply (op.getparams () || {}, {...