Comment envoyer des paramètres supplémentaires lors du chargement d'un magasin à un combobox dans ExtJS 4?
Comment puis-je envoyer des paramètres supplémentaires lors de l'utilisation d'un magasin pour une zone de liste déroulante dans ExtJS 4?
Je sais que je peux utiliser "extraParams" dans les paramètres de proxy, mais qui va affecter TOUS les éléments qui utilise le même magasin.
I. e si j'ai une Grille à l'aide d'un magasin appelé "Utilisateurs" qui liste tous les utilisateurs dans un système. Dans le même temps, j'ai une zone de liste déroulante, qui utilise également la mémoire "Utilisateurs", mais cette fois, je veux la liste de tous les Utilisateurs qui ont un statut "=2", donc je veux envoyer le param "&mode=2" sur l'appel Ajax pour le back-end.
Si j'utilise quelque chose comme:
store.getProxy().extraParams = {
status: 2
};
Cela va fonctionner, mais la Grille en même temps être mis à jour pour utiliser "&mode=2". Je veux SEULEMENT la zone de liste déroulante pour utiliser le param.
Je suppose que je pourrais désactiver "autoupdate" sur la Grille, puis réglez le "extraParams" sur le "rendu" de l'événement sur la zone de liste déroulante, puis annuler lorsque la zone de liste déroulante obtient caché, mais ce serait une très laid solution.
Je pouvez également dupliquer le magasin à un "Users2" et l'utiliser pour la zone de liste déroulante, mais c'est d'un laid solution.
Quelle est la bonne façon de le faire? Il doit être quelque chose de très commun pour la plupart des gens.
Mise à JOUR 1:
Je sais que je peux utiliser quelque chose comme:
store.load({
params:{
'foo1': bar1,
'foo2': bar2
}
});
Mais comment pourrais-je l'utiliser dans ExtJS 4 MVC? Là je viens de préciser "store: les Utilisateurs" dans la forme-objet. Comment puis-je envoyer ces paramètres supplémentaires à la .fonction load ()?
J'ai essayé ce qui suit:
{
xtype: 'combobox',
fieldLabel: 'Server',
name: 'server',
//store: 'ServersIP',
store: new Cloud.store.ServersIP(),
/*
listeners: {
beforeload: function(store, options) {
console.log(store);
}
},
*/
valueField: 'id',
displayField: 'name_id',
emptyText: 'Select a Server...',
editable: false
},
Cependant, il donne une erreur "Uncaught TypeError: Cannot read property 'ServersIP' undefined"
Mais le nom est correct:
Ext.define('Cloud.store.ServersIP', {
extend: 'Ext.data.Store',
model: 'Cloud.model.Server',
Aussi, où exactement je l'ai mis à l'auditeur? Je suppose que je n'ai pas qu'une seule bonne dans mon exemple?
Mise à JOUR 2:
J'ai un peu plus loin à une solution maintenant:
store: Ext.create('Cloud.store.ServersIP', {
proxy: {
extraParams: {
param1: 'value1',
param2: 'value2'
}
},
}),
Le ci-dessus ne fonctionne PAS. Il fonctionne si je n'ai qu'un "niveau" de la variable dans les params de Ext.Créer. Pour une raison quelconque, il n'aime pas quand je passe proxy => extraParams => param1.
Celui-ci fonctionne:
store: Ext.create('Cloud.store.ServersIP', {
aaa: 'bbb'
}),
Mais bien sûr, mon extraParams ne sont pas là. Quelqu'un sait comment résoudre cette dernière partie?
OriginalL'auteur Daniele Testa | 2013-07-20
Vous devez vous connecter pour publier un commentaire.
Je viens de résoudre ce problème.
combobox queryMode:à distance avec des paramètres supplémentaires.
il vous suffit d'instancier la boutique en "VUE" à l'intérieur de initComponent et remplacer le proxy
et dans xtype:zone de liste déroulante
J'espère que vous comprenez ma solution proposée.
OriginalL'auteur Rio Adetya Rizky
Au lieu de la référence à la même banque que la grille, vous pouvez créer une nouvelle instance de la même banque. De cette façon, les deux instances sont gérés séparément.
Dans votre formulaire de remplacer
store: 'Users'
avecstore: new MyApp.store.Users()
et puis vous pouvez utiliser n'importe quelle méthode fonctionne le mieux pour vous (extraparams, de charge avec params, beforeload à l'écoute, etc)Oui peut confirmer que cela ne fonctionne pas. essayé pendant 3 jours... pas de chance, c'est un extjs bug avec les filtres et les magasins. Tu ne peux même pas faire de l'extra params post en conséquence.
OriginalL'auteur dbrin
Créer une nouvelle instance de la boutique pour empêcher les mises à jour des autres lieux qui utilise le magasin.
Puis utilisez le "beforequery" événement à injecter les paramètres nécessaires.
OriginalL'auteur Daniele Testa
Vous pouvez prendre le "beforeload" enregistrer l'événement et de modifier le courant de charge de l'opération.
De cette façon, les paramètres de ne pas persister à d'autres demandes.
Ext JS 6.0.1 j'ai eu de mise à jour un peu: op.setParams(Ext.appliquer(op.getParams()||{},{ ...
OriginalL'auteur TheZver
Vous pouvez définir
autoLoad
sur false dans votre magasin, et ensuite appeler lavide
méthode vous-même, et d'utiliser leparams
option:Qui ne fonctionnera que si vous avez besoin de votre combo pour charger qu'une seule fois et ensuite la requête en mode local. Si vous avez besoin de votre combo pour faire plusieurs appels au serveur (mode distant), définissez vos paramètres dans le
beforeload
cas de la boutique:Aussi, la Grille est à l'aide de la même banque. Mettre le magasin "autoLoad=false" va me forcer à charger manuellement le stocker dans TOUS les lieux où le magasin est utilisé. J'utilise ce magasin dans de nombreux endroits dans mon application.
En utilisant la même instance de la banque pour la grille et le combo est la mendicité pour les problèmes. Lorsque votre combinaison vous permettra de filtrer son magasin afin d'appliquer sa requête, qui sera également le filtre de votre grille. Ce n'est probablement pas ce que vous voulez. Vous devez fournir le combo avec son propre magasin en fournissant une configuration avec
xtype
ouxclass
.Oui, c'est la façon dont je l'ai maintenant, mais je pense que c'est un vilain solution. Je préfère être en mesure d'utiliser un générique magasin, puis appliquer les paramètres en fonction de l'objet à l'aide de la banque. Comme la grille voudrez peut-être "&mode=1&clean=1" et de la zone de liste déroulante voudrez peut-être "&mode=2&clean=0". Assez merdique que ExtJS ne prend pas en charge cette fonction par défaut. Tout ce qui serait nécessaire pour être en mesure de mettre les "params" directement sur l'objet à l'aide de la banque.
Il y a un autre problème que vous êtes dominant et c'est la liaison de données aux points de vue. Si vous modifiez la même instance de la banque dans un point de vue de l'autre point de vue va changer avec elle, conduisant à des problèmes inattendus.
OriginalL'auteur rixo
C'est le meilleur code que je pouvais venir. Pas d'auditeur est nécessaire 🙂
Créer une nouvelle instance de la "utilisateurs"-stocker et de modifier les paramètres que l'on en.
MyApp.store.Users
...Non, il n'a pas.
Le résultat de mon test montre qu'il n'a mis extraParams pour toutes les instances de MyApp.magasin.Les utilisateurs.
OriginalL'auteur Daniele Testa