【问题标题】:ExtJS 4 - ComboBox IssueExtJS 4 - 组合框问题
【发布时间】:2011-11-13 07:15:53
【问题描述】:

我在使用 extjs 组合框时遇到了问题(无论使用哪种浏览器,都在 Chrome 和 FF 中进行了测试,结果相同)。

组合框加载得很好,两个条目都显示了。我可以选择最初加载的两个之一,但是如果我在选择后尝试更改选择,它会保留原始值并且不会触发选择或更改事件。我发现如果我开始输入未选择的条目,自动完成会接管,我可以按回车键来选择条目并触发选择事件和更改事件。为什么我不能直接点击未选择的条目来选择它?

这是模型、读取器、数据存储和组合框代码:

//Model
Ext.define('cbMonitorModel', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'iMonitorID', type: 'String'},
        {name: 'sMonitorName', type: 'String'}
    ]
});

//Reader
var cbMonitorReader = Ext.create('Ext.data.JsonReader',{
    type: 'json',
    model: 'cbMonitorModel'
});

//Store
var cbMonitorDataStore = Ext.create('Ext.data.Store',{
fields: ['iMonitorId','sMonitorName'],
autoLoad: true,
proxy: {
    type: 'ajax',
    url: '/inc/ajax/Monitors.php',
    actionMethods: 'POST',
    reader: cbMonitorReader,
    extraParams: {
        task: 'getMonitors',
        domain: sMonitorDomainName
    }
}
});

//ComboBox
Ext.create('Ext.form.ComboBox',{
    fieldLabel: 'Monitor',
    store: cbMonitorDataStore,
    queryMode: 'local',
    displayField: 'sMonitorName',
    valueField: 'iMonitorId',
    renderTo: Ext.get('monitorSelect'),
    width: 400,
    listeners: {
        select: function(combo, records, opts) {
            console.log('MonitorComboBox - Select');
            console.log(combo);
            console.log(records);
            console.log(opts);
            console.log(cbMonitorDataStore);
            console.log('--------------------------------------------------------------------');
        }
    }
});

代理返回以下字符串:

[{"iMonitorID":"85","sMonitorName":"6176 - xxx.xxx.xxx.xxx default monitor"},{"iMonitorID":"86","sMonitorName":"14177 - aaa.bbbbbbbbb.com default monitor"}]

谢谢。任何帮助将不胜感激。


编辑:2011-09-08 16:32 CST

我还没有弄清楚这个问题,但与此同时,我发现了一个“肮脏”的解决方法......展开事件清除了以前的值,它允许用户选择不同的值,但是那么问题是我不能使用“getValue()”......因此cb.lastSelection[0].raw.iMonitorID字符串......

组合框代码:

var MonitorCB = Ext.create('Ext.form.ComboBox', {
    fieldLabel: 'Monitor',
    store: cbMonitorDataStore,
    queryMode: 'local',
    displayField: 'sMonitorName',
    valueField: 'iMonitorName',
    width: 400,
    renderTo: 'monitorSelect',
    listeners: {
        select: function(cb, rec, opts){
            console.log(cb.lastSelection[0].raw.iMonitorID);
        },
        expand: function(){this.clearValue()}
    }
});

【问题讨论】:

  • 这个组件似乎定义得很好。在我看来,问题可能是由 renderTo 配置引起的...在 Api 中,他们指定 如果组件是,请不要使用此选项成为 Container 的子项。容器的布局管理器负责渲染和管理其子项。 所以基本上我所理解的组件不管理渲染本身,它留给容器。为什么不使用 items 配置将组件添加到容器中,并放弃配置 renderTo。
  • 感谢 nscrob,我最初将这个组合框嵌套在一个面板中,然后渲染到与现在组合框相同的位置,那里也发生了同样的问题。我认为这与数据存储有关,因为如果我不使用代理,而是在“字段”和“数据”中使用硬编码(不现实但很好奇),它就可以正常工作。
  • 现在我想起来了,我在网格的复选框列模型中遇到了同样的问题,我发现问题在于商店在其他地方使用,事实是在 extjs4 中商店它与组件的绑定更紧密,对记录的任何修改都需要提交才能使用它来呈现组件。如果您在其他地方使用商店,这可能是问题...
  • 我在一个独立的页面上开发这个,因为我认为这也可能是问题(它以前发生过,我相信它会再次发生),所以没有变量冲突。没有其他组件触及 cbMonitorDataStore。查看我添加的肮脏解决方法。再次感谢您的观看。

标签: extjs extjs4


【解决方案1】:

您的代码有误。在组合框配置中valueField: 'iMonitorId' 用小写字母d 指定,而在模型配置中name: 'iMonitorID' 用大写字母指定(代理返回'iMonitorID's)。

顺便说一句。您将阅读器与模型和商店的字段配置一起使用。没有使用正确模型的字段配置,因为商店已经有错误的字段配置。

所以解决办法是:

1. 删除商店配置中的 fields: ['iMonitorId','sMonitorName'],
2. 将组合框配置中的 valueField 更改为 'iMonitorID'

【讨论】:

  • </facepalm>... 好吧,fields:['iMonitorId','sMonitorName'], 来自问题开始后我在值中硬编码...不敢相信我花了这么长时间寻找“d”.. . 感谢捕获分子。
  • 我遇到了类似的问题。删除值字段的使用对我有用。从文档中不清楚它应该做什么 + 它似乎只是破坏了选择事件
猜你喜欢
  • 2012-02-23
  • 2011-11-25
  • 2011-08-05
  • 1970-01-01
  • 2014-08-12
  • 2011-08-23
  • 1970-01-01
  • 2012-02-20
  • 2011-11-12
相关资源
最近更新 更多