5

我已经编写了一些运行良好的代码,但是我有一个奇怪的错误这里是一个例子......


请观看我的 COMBOBOX BUG 视频


就像我说的,每次触发 datachanged 时效果都很好 - 选择了正确的索引并显示了 displayField,但是每次我在组合框中键入一些文本之后,当“datachanged”触发时,它不会显示 displayField。相反,它显示来自我启动的 setValue 方法的值。

奇怪的是,如果我不输入文本并用鼠标更改选择,就没有错误。最后,这仅在我在组合框中键入文本时出现。

有没有人听说过这个错误,有解决方案或一些明智的建议?

编码 !

两个数据存储

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

如果datachanged我设置了Combobox“CompteurCommunes”的新值:

   ficheDataStore.addListener('datachanged', handleDatachangedEvent);

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

5 回答 5

3

这可能是因为当您在组合中输入随机数据时,它可能无法每次都找到正确的 fieldValue。然后它停留在最后一个不存在的值。

在 datachanged 事件处理程序中执行 new setValue() 之前,尝试将 ComboBox 设置为任何现有值(在组合的数据存储中)。或者您可以尝试使用 clearValue() 方法重置之前的(未定义的)valueField。

还有 initList() 方法将组合重置为初始状态。

编辑:经过一些测试,我发现: combo.store.clearFilter(); 必须在外部事件处理程序中的 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

你可以看看 Ext.form.ComboBox 的 hiddenName 和 hiddenId 参数。如果您设置与组合框链接的隐藏表单字段的值,那么组合框将呈现该值的标签而不是值本身。

当您需要在服务器端设置值并将用户定向到页面时,这很有用。

另一个有用的方法是 selectByValue。此方法将选择值等于传递参数的元素。

在您的 dataChangedListener 中,您应该设置与 ComboBox 关联的值隐藏表单字段,而不是设置组合框的值。此外,在设置隐藏字段的值后,您可能必须触发 selectByValue 方法。

您可以查看 ExtJS API 文档以供进一步参考。

于 2009-02-07T12:47:14.363 回答
0

万一有人 - 像我一样 - 通过谷歌到达这里,因为它与他们的 ComboBox ft. setValue() 问题最相似:

经过一个小时的深入了解 Ext 的内部结构后,我发现我需要为组合框设置lazyInit: false。它默认为 true,如果您不知道这一点,则为 true 可能会导致不合逻辑的行为。你为什么要这样做?默认情况下,其他任何东西似乎都不是懒惰的。

于 2011-06-24T06:02:58.227 回答