组合框上的 Extjs 4.2 远程过滤器

Posted

技术标签:

【中文标题】组合框上的 Extjs 4.2 远程过滤器【英文标题】:Extjs 4.2 remote filter on combobox 【发布时间】:2015-05-13 14:30:50 【问题描述】:

远程存储有一个非常奇怪的问题,看起来像这样:

商店:

Ext.define('freetextOrder.store.Attachment', 
    extend: 'Ext.data.Store',
    model: 'freetextOrder.model.Attachment',
    autoLoad: false,
    proxy: 
        actionMethods: 
            create: "POST",
            read: "POST",
            update: "POST",
            destroy: "POST"
        ,
        type: 'ajax',
        filterParam: 'filter',
        remoteFilter: true,
        autoSync: true,
        api: 
            read: 'ajax/Attachment/Cartarticle/Init',
            update: 'ajax/Attachment/Cartarticle/Update',
            create: 'ajax/Attachment/Cartarticle/Create',
            destroy: 'ajax/Attachment/Cartarticle/Destroy'
        ,
        reader: 
            type: 'json',
            root: 'results',
            successProperty: 'success'
        ,
        writer: 
            type: 'json',
            allowSingle: false
        ,
        extraParams: sid: config.sid
    ,
    listeners: 
        datachanged: function (store) 

            if (Ext.getCmp('attachmentGrid'))
                if (store.getCount() > 0) 
                    Ext.getCmp('attachmentGrid').show(); 
                 else 
                    Ext.getCmp('attachmentGrid').hide();
                
        
    
);

型号:

Ext.define('freetextOrder.model.Attachment', 
    extend: 'Ext.data.Model',
    fields: [
        name: 'id', type: 'int',
        name: 'cartarticle_id', type: 'int',
        name: 'orig_filename', type: 'string',
        name: 'upload_time', type: 'date'
    ]

);

我的任务是不可能的,从商店加载过滤器:

 
            xtype: 'combobox',
            queryMode: 'local',
            mode: 'local',
            fieldLabel: 'template',
            id: 'attachmentTemplate',
            name: 'test',
            store: Ext.create('freetextOrder.store.Attachment'),
            valueField: 'cartarticle_id',
            displayField: 'orig_filename',
            lazyInit: false,
            editable: true,
            invalidCls: '',
            listeners: 
                afterrender: function () 
                    var combo = Ext.getCmp('attachmentTemplate')

                    combo.getStore().clearFilter(true);
                    combo.getStore().addFilter(property: 'id', value: config.options.attTemplateIds);
                    combo.getStore().load();

                    console.log(combo.getStore().getById(49));
                
            
        

问题是我试图使用的事件,我尝试了一切让该死的东西加载商店元素,但它就是不会让步。

console.log(combo.getStore().getById(49));返回一个对象,以便加载商店。但是它无法加载到它自己的组合框的选项中......

奇怪的部分是:

当我转到页面并在 chrome 命令提示符下执行代码时:

                 var combo = Ext.getCmp('attachmentTemplate')

                    combo.getStore().clearFilter(true);
                    combo.getStore().addFilter(property: 'id', value: config.options.attTemplateIds);
                    combo.getStore().load();

选项被加载。我走到了尽头。我必须将 config.options.attTemplateIds 传递给过滤器。这是唯一的要求。并且该值仅在定义了 xtype: 'combobox' 时可用。

看在白痴的份上,我什至在元素周围尝试了最骇人听闻的选项 setTimeout...仍然没有...真的很奇怪的行为。

【问题讨论】:

为什么有 queryMode : local?你试过删除它吗? queryMode: 'local' 更改为queryMode: 'remote' 已经试过了。没有效果。它唯一要做的就是使加载变慢。但仍然没有显示数据。 【参考方案1】:

有两个事情或事件:第一个是combo的afterRender,第二个是store的load;

combo.getStore().getById(49) 必须在第二个事件之后使用;但是你把它放在combo的afterRender中,而store的数据可能还没有!

【讨论】:

【参考方案2】:

一年后我在这个问题上绊倒了,又浪费了 4 小时试图让它工作,但没有成功.. 在我记得解决方法之后.. 我将它发布给其他人使用。

您可以使用额外的参数进行过滤。只需要做这样的事情

    var store = Ext.getStore('xxxx');
    store.getProxy().setExtraParam("xxx", newValue);
    store.load();

【讨论】:

以上是关于组合框上的 Extjs 4.2 远程过滤器的主要内容,如果未能解决你的问题,请参考以下文章

组合框上的参数值

EXTJS:如何在组合框上自动完成查询后从数据存储中清除“查询”参数

如何同步组合框和文本字段值。即如何从存储在文本字段中加载不同的值,而我正在更改组合框上的值

如何在具有嵌套数据的网格中设置组合框值? Extjs 4.2 Mvc

使用带有排序组合框和页面组合框上的许多项目的列表视图

使用 ExtJS 过滤具有来自一个属性的值数组的存储