在 ExtJs 中本地过滤组合框远程存储

Posted

技术标签:

【中文标题】在 ExtJs 中本地过滤组合框远程存储【英文标题】:Filtering a comboxes remote store locally in ExtJs 【发布时间】:2011-01-21 12:13:05 【问题描述】:

我有一个 ExtJs 组合框。它的商店使用 JSON 加载(使用下面的 MyStore 类)。我想将所有值加载到存储中,然后使用组合文本字段中输入的文本过滤它们(最好使用 typeAhead 功能)。

问题是我想在客户端进行过滤(默认情况下,组合的模式属性是“远程”)。我不希望我的组合每次输入内容时都重新加载它的商店。 我该怎么做?

谢谢。

这是我的商店类:

MyStore = Ext.extend(Ext.data.JsonStore, 
    constructor: function(jsonUrl, storeId, id, description, isAutoLoad, cfg) 
        cfg = cfg || ;
        GenericStore.superclass.constructor.call(this, Ext.apply(
            storeId: storeId,
            root: 'result',
            url: jsonUrl,
            autoLoad: isAutoLoad,
            fields: [
                
                    name: id
                ,
                
                    name: description
                
            ]
        , cfg));
        
);

还有组合:

            xtype: 'combo',
            fieldLabel: 'The Combo',
            width: 150,
            store: myStoreData,
            valueField: 'id',
            displayField: 'name',
            minChars : 0,
            editable : false,
            itemId : 'my-combo'

【问题讨论】:

【参考方案1】:

要实现这一点,您必须:

    构造 MyStore 类,将“isAutoLoad”配置选项设置为“true” 在您的组合框配置中,将“模式”配置选项设置为“本地”(有关其他配置,请参阅下面的构建组合配置代码)

这是我的简短示例:

构造 myStoreData 变量

var myStoreData = new MyStore(
    autoLoad: true, //so the store will load automatically
    ...any_other_config_option...
);

构建组合配置


     xtype: 'combo',
     fieldLabel: 'The Combo',
     width: 150,
     store: myStoreData, 
    // myStoreData is already loaded before as it have 'autoLoad' config set to true 
    // and act as localstore to populate the combo box item 
    // when the combo "mode" config set to 'local'
     valueField: 'id',
     displayField: 'name',
     minChars : 0,
     editable : true, //before was editable : false,
     itemId : 'my-combo',
     mode: 'local', // by default this was mode: 'remote'
     typeAhead: true // by default this was typeAhead: false

【讨论】:

谢谢,这有帮助。 (虽然不是isAutoLoad,而是autoLoad,试图编辑它,但我没有编辑权限)由于项目特定的限制,我无法使用autoLoad功能,但我在combo的焦点事件上手动加载了商店和它在“本地”模式组合上运行良好。 很高兴知道它对您有帮助。祝你的项目好运 这对我不起作用。我使用 ExtJS 4.2 并设置了queryMode: 'local',但它本质上只是调用store.filter(),当商店有配置remoteFilter: true 时,它会加载商店。【参考方案2】:

您将需要使用 store.filter() 方法。您可以使用它来使用用户输入的信息来过滤组合框使用的商店。这取自 data.store 的 ExtJS API 文档。

store.filter([

property     : 'name',
value        : 'Ed',
anyMatch     : true, //optional, defaults to true
caseSensitive: true  //optional, defaults to true
,
//filter functions can also be passed

fn   : function(record) 
return record.get('age') == 24
,
scope: this

]);

【讨论】:

是的,combo 在其 doQuery 方法中调用此方法。你的意思是我应该重写这个方法吗?如果是这样,怎么做?谢谢 初始数据集是静态的吗?您可以将其输出到可用于填充本地数据存储的 json 文件。然后您可以尝试使用 mode:local 选项.... 从那里您可以使用对组合框使用的存储的引用来执行 filter() 方法。请参阅 Gajahlemu 的代码......那里有很多很好的设置可以满足您的要求。【参考方案3】:

就我而言,我必须将配置选项 lastQuery:'' 添加到组合中。

解释:http://progex.wordpress.com/2010/03/26/extjs-combo-dropdown-does-not-filter-on-first-trigger/

【讨论】:

【参考方案4】:

在“加载”事件时将侦听器添加到您的商店,通过删除或标记记录进行过滤,如果删除它是明确加载到组合组件,如果标记您需要识别组合中的那些标记并显示与否...

如果我没有看到您的商店和组合代码,很难提供更多细节,所以我只能给您大致的想法

【讨论】:

以上是关于在 ExtJs 中本地过滤组合框远程存储的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS 组合框和过滤存储

似乎无法在 Extjs 中远程填充组合框

Extjs 组合框显示具有从数据存储 rest/jsp 请求中获取的值的记录

ExtJS 组合框错误:无法读取未定义的属性“存储”

ExtJs 组合框分页工具栏属性

来自本地数组的 ExtJs 组合框