5

かなりうまく機能するコードをいくつか書きましたが、奇妙なバグがあります ここに例があります...


私のコンボボックスのバグビデオを見てください


私が言ったように、これは datachanged が発生するたびにうまく機能します - 正しいインデックスが選択され、displayField が表示されますが、コンボボックスにテキストを入力した後、後で "datachanged" が発生すると、displayField が表示されません。代わりに、起動した setValue メソッドからの値が表示されます。

奇妙なことに、テキストを入力してマウスで選択を変更することがなければ、バグはありません。最後に、これはコンボボックスにテキストを入力したときにのみ表示されます。

誰かこのバグについて聞いたことがありますか、解決策、または賢明なアドバイスがありますか?

コード !

2 つのデータ ストア:

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'}])
});

最初にこのようなものを返す人:

  {results:[{"Nom":"cercle interieur"},{"Observations":""},{"Codes":" "},{"Adresse":"dd"},{"CompteurCommunes"
    :"1"},{"TagClient":"3-56"},{"GUID":"443609c6-d064-4676-a492-7baa7b4288d1"},{"AdresseFacturation":""}
    ,{"CompteurCommunesFacturation":"1"}]}

後者の場合:

{"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"}]}

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: ''
              });

イベントでは、 「CompteurCommunes」datachangedの新しい値を設定します:Combobox

   ficheDataStore.addListener('datachanged', handleDatachangedEvent);

     function handleDatachangedEvent() 
       {
        try {
              comb.setValue(ficheDataStore.getAt(4).data.Compteur);                                                                                 
            }
        catch (err) { }
        }
4

5 に答える 5

3

おそらく、コンボにランダムなデータを入力すると、毎回正しいフィールド値が見つからない可能性があるためです。次に、最後の存在しない値でスタックします。

datachanged イベント ハンドラーで new setValue() を実行する前に、ComboBox を既存の値 (コンボのデータストア内) に設定してみてください。または、clearValue() メソッドを使用して、以前の (未定義の) valueField をリセットすることもできます。

コンボを初期状態にリセットする initList() メソッドも存在します。

編集:いくつかのテストの後、次のことがわかりました 外部イベント ハンドラで setValue の前に使用する必要があります。

于 2009-02-07T12:18:43.033 に答える
1
function formatComboBox(value, metaData, record, rowIndex, colIndex, store) {
        myStore = Ext.getCmp('myComboBox');
        myStore.clearFilter();
        var idx = myStore.find('value',value);
        return (idx != '-1') ? myStore.getAt(idx).data.label : value;
}
于 2010-04-21T18:27:47.710 に答える
0

まず、アイテムが選択されたときに Ext JS コンボボックスが自動的に値を適用して表示する必要があります。これは、ストアを割り当てて、フィールドに値が必要であることを Ext に伝えた場合を除きます。

あなたが要求しているように見える値 (CompteurCommunes) は、リーダーの定義には表示されないため、データ ストア内のレコードの一部になります。

ComboBox にこの値を設定しようとしている根本的な理由は何ですか?

于 2009-02-06T19:10:44.590 に答える
0

私のような誰かが、ComboBox ft. setValue() の問題に最も似ているため、Google からここにアクセスした場合:

Ext の内部に 1 時間ほど足を踏み入れた後、コンボ ボックスにlazyInit: falseを設定する必要があることがわかりました。これはデフォルトで true に設定されており、これを知らないと、true であると非論理的な動作が発生する可能性があります。そして、なぜあなたは?デフォルトでは、他のものは怠惰ではないようです。

于 2011-06-24T06:02:58.227 に答える