如何让组合框选择与 ExtJS6 中显示的值不同的值?

Posted

技术标签:

【中文标题】如何让组合框选择与 ExtJS6 中显示的值不同的值?【英文标题】:How to have combobox to select different value than displayed in ExtJS6? 【发布时间】:2016-03-23 23:51:47 【问题描述】:

我有一个基本组合框链接到具有 3 个字段的商店:idnamedescription。我正在尝试使组合框的行为如下:

组合框展开时显示description description 在输入时可搜索 当用户从列表中选择任何项目时显示nameid 设为组合框的内部值

以下配置解决了几乎所有问题,除了 description 可搜索:


    xtype: 'combo',
    queryMode: 'local',
    triggerAction: 'all',
    forceSelection: false,
    editable: true,
    anyMatch: true,
    valueField: 'id',
    displayField: 'name',
    listConfig: 
        itemTpl: 'description'
    ,
    store: store,
,

【问题讨论】:

【参考方案1】:

选项 1:

您可以覆盖 Combobox - doLocalQuery 方法并添加对另一种属性(如 searchField)的支持。我在此方法中所做的唯一更改将property: me.displayField, 替换为

property: me.searchField || me.displayField,

如果配置了 searchField,那么它将使用搜索字段,否则将回退到常规 displayField。

Ext.define('App.override.form.field.ComboBox', 
    override: 'Ext.form.field.ComboBox',


    doLocalQuery: function(queryPlan) 
        var me = this,
            queryString = queryPlan.query,
            store = me.getStore(),
            filter = me.queryFilter;

        me.queryFilter = null;

        // Must set changingFilters flag for this.checkValueOnChange.
        // the suppressEvents flag does not affect the filterchange event
        me.changingFilters = true;
        if (filter) 
            store.removeFilter(filter, true);
        

        // Querying by a string...
        if (queryString) 
            filter = me.queryFilter = new Ext.util.Filter(
                id: me.id + '-filter',
                anyMatch: me.anyMatch,
                caseSensitive: me.caseSensitive,
                root: 'data',
                // use searchField if available or fallback to displayField
                property: me.searchField || me.displayField,
                value: me.enableRegEx ? new RegExp(queryString) : queryString
            );
            store.addFilter(filter, true);
        
        me.changingFilters = false;

        // Expand after adjusting the filter if there are records or if emptyText is configured.
        if (me.store.getCount() || me.getPicker().emptyText) 
            // The filter changing was done with events suppressed, so
            // refresh the picker DOM while hidden and it will layout on show.
            me.getPicker().refresh();
            me.expand();
         else 
            me.collapse();
        

        me.afterQuery(queryPlan);
    
);

这将是组合配置


    xtype: 'combo',
    queryMode: 'local',
    triggerAction: 'all',
    forceSelection: false,
    editable: true,
    anyMatch: true,
    valueField: 'id',
    displayField: 'name',
    searchField: 'description',
    listConfig: 
        itemTpl: 'description'
    ,
    store: store,
,

https://fiddle.sencha.com/#fiddle/17lc

选项 2:

将 displayField 配置为描述,只需将 displayTpl 配置为使用“name”属性。此外,您还可以删除 listConfig。


    xtype: 'combo',
    queryMode: 'local',
    triggerAction: 'all',
    forceSelection: false,
    editable: true,
    anyMatch: true,
    valueField: 'id',
    displayField: 'description',
    displayTpl: new Ext.XTemplate(
        '<tpl for=".">' +
        '[typeof values === "string" ? values : values["name"]]' +
        '</tpl>'
    ),
    store: store,

https://fiddle.sencha.com/#fiddle/17ld

【讨论】:

对选项 2 的 displayTpl 进行小幅更改以更好地适应可编辑值,否则在商店重新加载时将清除当前值:'[typeof values === "string" ? values : (typeof values["name"] === "undefined" ? values["id"] : values["name"])]'【参考方案2】:

这个怎么样?


    xtype: 'combo',
    queryMode: 'local',
    triggerAction: 'all',
    forceSelection: false,
    editable: true,
    anyMatch: true,
    valueField: 'id',
    displayField: 'name',
    listConfig: 
        itemTpl: 'description'
    ,
    store: store,
    listeners: 
        change: function() 
          var store = this.store;
          store.clearFilter();
          store.filter(
              property: 'description',
              anyMatch: true,
              value   : this.getRawValue()
          );

          this.expand();
        
    
,

https://fiddle.sencha.com/#fiddle/17ks

更新: 上面的代码在打字时看起来不错。 但是选择了一些数据后,由于过滤了,无法展开……

我也试过下面的代码。第二个例子。

listeners: 
    keyup: function() 
      var store = this.store;
      store.clearFilter();
      store.filter(
          property: 'description',
          anyMatch: true,
          value   : this.getRawValue()
      );

      this.expand();
    ,
    collapse: function() 
      var store = this.store;
      // Reset filter here.
      store.clearFilter();
    
,

在小提琴中运行的第二个示例:https://fiddle.sencha.com/#fiddle/17ku

我觉得第二个代码比第一个代码好。 但它也不能完美地工作......

【讨论】:

以上是关于如何让组合框选择与 ExtJS6 中显示的值不同的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何让组合框2显示仅与组合框1中所做的选择相关的记录?

使用多值控制源隐藏组合框中的值

如何在 Access 中打开表单,自动选择组合框中的值并显示详细信息?

组合框选择加载上一个选择

如何在组合框中返回未绑定列的值

如何在数据网格视图中显示数据