2009-05-17 8 views
0

Ceci est mon premier bash à utiliser extJS, et après quelques heures de difficultés, certaines choses fonctionnent correctement, sauf que j'ai des listes de combo que je ne peux pas filtrer à moins de 2000 éléments dans les cas de marge, donc j'essaie de parcourir les listes à distance, mais je dois faire quelque chose de mal.Chargement à distance du Combo extJS

Mon magasin de données et look combo comme suit:

var remoteStore = new Ext.data.JsonStore({ 
     //autoLoad : true, 
     url   : 'addition-lists.aspx', 
     fields  : [{name: 'extension_id'}, {name: 'extension'}], 
     root  : 'extensionList', 
     id   : 'remoteStore'    
    }); 
. 
. 
         xtype   : 'combo', 
         fieldLabel : 'Remote', 
         name   : 'remote', 
         displayField : 'extension', 
         valueField : 'extension_id', 
         mode   : 'remote', 
         //pageSize  : 20, 
         triggerAction : 'query', 
         typeAhead  : true,      
         store   : remoteStore, 
         anchor  : '95%' 

Le combo fonctionne le chargement local, mais dès que je passe à distance, il reste vide.

Ma page ASP.NET retour JSON est comme ceci:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.Write(GetRemote()); 
} 

Répondre

2

Sur les magasins distants, le combo définit par défaut sa propriété minChars sur 4, de sorte que la requête est envoyée uniquement après avoir tapé 4 caractères. Le réglage minChars donne presque le comportement désiré. Je dis presque parce que même si l'élément recherché par saisie semi-automatique est dans la page en cours, une nouvelle requête serveur est toujours envoyée, par défaut la sélection du premier élément de la nouvelle page.

-1

Vous devez définir un proxy, à savoir mettre

proxy: new ScriptTagProxy

propriété pour le chargement «magasin» à distance. Regardez des exemples pour la syntaxe exacte.

EDIT: Veuillez ne pas tenir compte de ma note précédente puisque vous utilisez le raccourci JsonStore.

Essayez d'appliquer toutes ces propriétés à votre combo:

typeAhead: true, 
    typeAheadDelay: 500, 
    triggerAction: 'all', 
    selectOnFocus:true, 

Et s'il vous plaît ne le faites pas prélecture côté serveur d'enregistrements (en utilisant loadData). Cela blesse beaucoup le filtre interne, de sorte que vous vous en tenez à des enregistrements filtrés provenant de préfetches différentes. Par contre, si vous préférez récupérer tous les enregistrements côté serveur, pourquoi avez-vous besoin d'un accès à distance pour votre combo ?!

0

Plusieurs choses. Tout d'abord, en procédant ainsi:

remoteStore.loadData (<% = GetRemote()%>);

Vous n'êtes pas en train d'effectuer un appel distant depuis votre javascript. Vous faites écho au résultat de l'appel de la fonction du serveur GetRemote directement dans la page au temps de rendu. Probablement pas ce que tu as l'intention? Si GetRemote écrit vos données de liste déroulante (et que cela fonctionne correctement), vous devriez pouvoir utiliser une configuration de liste déroulante pour local. Si l'intention est vraiment de faire un appel à distance, alors vous devez supprimer la balise de serveur et charger les données via l'URL du proxy comme indiqué dans plusieurs exemples fournis avec Ext.

Une autre chose est que votre code Page_Load n'affiche rien sur la façon dont vous chargez, formatez ou renvoyez vos données. Je suggère d'afficher la source et de vérifier que votre tag est en train d'être remplacé par les données que vous attendez.Si/quand vous passez à un véritable appel distant pour charger des données, vous pouvez utiliser Firebug pour inspecter vos appels XHR et vérifier les données descendant de cette façon.

+0

@bmoeskau: Excuses, cet appel 'loadData' est resté après mon débogage - il était juste là pour vérifier que les choses fonctionnaient localement. S'il vous plaît voir ma réponse ci-dessus pour le vrai problème. – ProfK

1

La façon dont vous avez configuré votre magasin ci-dessus, le résultat de votre script ASP doit lire quelque chose comme ceci:

{"extensionList": [ 
    {"extension_id": 1, "extension": "js"}, 
    {"extension_id": 2, "extension": "aspx"} 
]} 

Si cela ne ressemble pas à cela, votre magasin distant ne trouvera rien.