EXTJS Combobox pas de la sélection par valueField après développez
J'ai écrit un code qui fonctionne assez bien, mais j'ai un bug étrange
Voici un exemple...
S'IL VOUS PLAÎT REGARDER MES COMBOBOX BUG DE LA VIDÉO
Comme je l'ai dit, cela fonctionne bien à chaque fois datachanged incendies - le droit de l'index est sélectionné et que le displayField est affiché, mais, à chaque fois après que j'ai tapez du texte dans la zone de liste déroulante, plus tard, quand le "datachanged les incendies", il l'habitude d'afficher la displayField. Au lieu de cela, il affiche la valeur de la méthode setValue je me lance.
La chose étrange est que si je ne suis pas toujours le type de texte et modifier la sélection avec la souris il n'y a pas de bug. Enfin, cela n'apparaît que lorsque je tape du texte dans la zone de liste déroulante.
Quelqu'un a entendu parler de ce bug, avez une solution, ou de quelques sages conseils?
Le Code !
Deux banques de données :
ficheDataStore = new Ext.data.Store({
id: 'ficheDataStore',
autoLoad: true,
proxy: new Ext.data.HttpProxy({
url: 'ficheDetail.aspx', //File to connect to
method: 'GET'
}),
baseParams: { clientId: clientId, Type: 'Fiche' }, //this parameter asks for listing
reader: new Ext.data.JsonReader({ //we tell the datastore where to get his data from
root: 'results'
}, [
{ name: 'GUID', type: 'string', mapping: 'GUID' },
{ name: 'TagClient', type: 'string', mapping: 'TagClient' },
{ name: 'Nom', type: 'string', mapping: 'Nom' },
{ name: 'Compteur', type: 'string', mapping: 'CompteurCommunes' },
{ name: 'CompteurCommunesFacturation', type: 'string', mapping: 'CompteurCommunesFacturation' },
{ name: 'AdresseFacturation', type: 'string', mapping: 'AdresseFacturation' },
{ name: 'Codes', type: 'string', mapping: 'Codes' },
{ name: 'Observations', type: 'string', mapping: 'Observations' },
{ name: 'Adresse', type: 'string', mapping: 'Adresse' }
])
});
communesDataStore = new Ext.data.Store({
autoLoad: true,
proxy: new Ext.data.HttpProxy({ url: 'ficheDetail.aspx?Type=Communes' }),
reader: new Ext.data.JsonReader({ root: 'results' }, [{ name: 'Compteur' }, { name: 'Localisation'}])
});
Qui en retour quelque chose comme ça pour l'
première:
{results:[{"Nom":"cercle interieur"},{"Observations":""},{"Codes":" "},{"Adresse":"dd"},{"CompteurCommunes"
:"1"},{"TagClient":"3-56"},{"GUID":"443609c6-d064-4676-a492-7baa7b4288d1"},{"AdresseFacturation":""}
,{"CompteurCommunesFacturation":"1"}]}
Pour le dernier :
{"results":[{ "Compteur" : "1","Localisation" : "6200 ST ISIDORE"},{ "Compteur" : "2","Localisation"
: "21340 CHANGE"},{ "Compteur" : "3","Localisation" : "1200 ELOISE"},{ "Compteur" : "4","Localisation"
: "1200 ST GERMAIN SUR RHONE"},{ "Compteur" : "5","Localisation" : "75000 PARIS"},{ "Compteur" : "6"
,"Localisation" : "75001 PARIS 1ER ARRONDISSEMENT"}]}
un Combobox
:
var comb = new Ext.form.ComboBox(
{
store: communesDataStore,
fieldLabel: 'Code postal',
//hiddenName: 'Compteur',
name: 'CompteurCommune',
id: 'CompteurCommunes',
width: 300,
typeAhead: true,
mode: 'local',
minChars: 0,
selecOnFocus: true,
forceSelection: true,
valueField: 'Compteur',
displayField: 'Localisation',
autocomplete: true,
emptyText: 'Selectionnez un code postal',
triggerAction: 'all',
value: ''
});
dans un datachanged
cas j'ai mis la nouvelle valeur de la Combobox
"CompteurCommunes" :
ficheDataStore.addListener('datachanged', handleDatachangedEvent);
function handleDatachangedEvent()
{
try {
comb.setValue(ficheDataStore.getAt(4).data.Compteur);
}
catch (err) { }
}
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
C'est probablement parce que lorsque vous tapez des données aléatoires dans la liste déroulante, il ne peut pas trouver de corriger fieldValue à chaque fois. Puis il stucks à la dernière non-valeur existante.
Essayez de mettre de zone de liste déroulante à tout existant valeur (dans la liste déroulante de la banque de données) avant de faire de nouvelles setValue() dans votre datachanged gestionnaire d'événement. Ou vous pouvez essayer d'utiliser clearValue() méthode pour réinitialiser le précédent (undefined) valueField.
Il y a aussi initList() la méthode existante pour réinitialiser la liste déroulante pour l'état initial.
EDIT: Après quelques tests, j'ai constaté que:
zone de liste déroulante.magasin.clearFilter(); doit être utilisé avant setValue dans le gestionnaire d'événements externes.
Êtes-vous sûr ficheDataStore.getAt(4).les données.Compteur) renvoie la valeur de la existe dans votre zone de liste déroulante de la banque de données? Sinon, vous devez l'ajouter à communesDataStore.
Encore un essai: set " forceSelection de valeur sur false avant de fixer une nouvelle Valeur, puis rallumez-le après.
Thevs, j'ai mis un lien vers une vidéo sur le dessus de ma question, voir, vous ne croyez pas, ficheDataStore.getAt(4).les données.Compteur fonctionne bien, ce n'est certainement pas un magasin de données problème.
Oui, j'ai testé toutes les options et les méthodes dans la documentation, y compris la 'forceSelection', j'ai aussi fait combobox édition avec firebug et de faire beaucoup de trucs à l'exception de détruire un nouveau rendu de la zone de liste déroulante.
OriginalL'auteur
OriginalL'auteur
Tout d'abord, l'Ext JS zone de liste déroulante doit appliquer automatiquement la valeur et afficher quand un élément est sélectionné, sauf que vous avez affecté un magasin et dit Ext le terrain exige une valeur.
La valeur semblent vous demander de CompteurCommunes) n'apparaît pas dans votre lecteur de définitions, de sorte qu'il serait d'une partie des archives de la banque de données.
Ce qui est la raison pour laquelle vous essayez de définir cette valeur pour le composant ComboBox?
Une autre façon de le dire, setValue initialiser mon displayField à la place de mon valueField seulement après, quand je clique sur dans.
OriginalL'auteur Steve -Cutter- Blades
Vous pouvez avoir un coup d'oeil à hiddenName et hiddenId paramètre de Ext.forme.Zone de liste déroulante. Si vous définissez la valeur de champ de formulaire masqué lié avec combobox puis combobox rendrait l'étiquette de valeur au lieu de la valeur elle-même.
Ceci est utile lorsque vous devez définir la valeur à la fin de serveur et de diriger l'utilisateur vers la page.
Une autre méthode utile est selectByValue. Cette méthode, sélectionnez l'élément dont la valeur est égale à l'argument passé.
Dans votre dataChangedListener au lieu de mise en valeur de la zone de liste déroulante, vous devez définir la valeur cachée de champ de formulaire associé avec zone de liste déroulante. Aussi après le réglage de la valeur du champ caché, vous pourriez avoir à feu selectByValue méthode.
Vous pouvez avoir un coup d'oeil à ExtJS Documentation de l'API pour plus de référence.
OriginalL'auteur
En cas n'importe qui - comme moi - arriver ici grâce à google parce que c'est la plus proche de leur zone de liste déroulante ft. setValue() problème:
Après une heure de monter dans out et Ext-même, j'ai trouvé que j'avais besoin de définir lazyInit: faux pour les zones de liste déroulante. La valeur par défaut est true et d'être vrai peut provoquer unlogical comportement si vous ne savez pas à ce sujet. Et pourquoi voudriez-vous? Rien d'autre ne semble pas être paresseux par défaut.
OriginalL'auteur