即使在过滤时重新加载商店后网格也不会改变

Posted

技术标签:

【中文标题】即使在过滤时重新加载商店后网格也不会改变【英文标题】:Grid doesn't change even after reloading store while filtering 【发布时间】:2013-04-07 10:26:02 【问题描述】:

我想要一个在删除任何行并检索具有相同成员 ID 的行后会更改或重新加载的网格。为此,我添加了过滤器。在删除任何行后,我再次使用过滤器回调存储。我的商店过滤好,但网格无法显示它......它保留了以前的显示......

Ext.define('$pkgName.v02x001001.SV02X00100101' , 
extend    : 'Ext.grid.Panel',
alias     : 'widget.sv02x00100101',
id        : 'sv02x00100101',
border    : true,
modal     : true,
height    : 300,
width     : 455,
viewConfig: 
    stripeRows    : true,
    forceFit      : true,
    emptyText     : 'No Records to display',
    listeners     : 
        viewready : function(v)                     
            var store = Ext.data.StoreManager.get('S02X001001');               
            store = !store ? Ext.create("S02X001001") : store;
            var value = Ext.getCmp('member-sv02x00100104').getValue(),
            filters   = new Array();
            store.clearFilter();
            store.filter('member', value);
            filters.push(
                property : 'member', 
                value    : value
              );
            store.loadPage(1, 
                filters  : filters
             ); 
        
    
,
initComponent: function() 
    this.store  = 'S02X001001';     

    this.tbar= Ext.create('Ext.ux.StatusBar',             
        topBorder       : false,
        statusAlign     : 'right',
        items    : [
            xtype       :'button',
            text        : 'ADD',
            icon        : "$resource(dir: 'images', file: 'ADD01003.png')",
            listeners   : 
                click   : this.onNewAddress
                
        ,'-']
    );

    this.columns = [
    
        text            : 'Address Line 1',
        dataIndex       : 'addressline1', 
        sortable        : false,
        flex            : 1
    ,
        text            : 'Address Line 2',
        dataIndex       : 'addressline2',
        sortable        : false,
        width           : 170
    ,
        menuDisabled    : true,
        sortable        : false,
        id              : 'deletee',
        xtype           : 'actioncolumn',            
        width           : 22,            
        items           : [
            icon        : "$resource(dir: 'images', file: 'DEL01005.png')",
            tooltip     : 'Delete This?',
            scope       : this,
            handler     : function(grid, rowIdx, colIdx) 
                var record = grid.getStore().getAt(rowIdx);
                var conId  = record.data.id
                this.onDeleteClick(conId);
            
        ]
    ]; 
    this.callParent(arguments);
,

onNewAddress: function(btn, e, eOpts)
    var view=Ext.widget('sv02x00100102');
    view.show();
    var a = Ext.getCmp('member-sv02x00100104').getValue();
            Ext.getCmp('member-sv02x00100102').setValue(a);
,
onDeleteClick:function(conId)
       Ext.MessageBox.show(
        title       : 'Delete',
        msg         : 'Really want to delete ?',
        icon        : Ext.Msg.WARNING,
        buttons     : Ext.MessageBox.YESNO,
        buttonText  : 
            yes: "Delete", 
            no : "No" 
        ,
        scope         : this,
        animateTarget : 'deletee',
        fn: function(btn, dbQty)
            if(btn == 'yes')
                var registration = Ext.create('$appName.model.M02X001001',
                    id : conId
                );
                var store = this.getStore();
                registration.destroy(
                    scope   : this,
                    success : function(model, operation)  
                        if(model != null)
                        var store = Ext.data.StoreManager.get('S02X001001');               
                        store = !store ? Ext.create("S02X001001") : store;
                        var value = Ext.getCmp('member-sv02x00100104').getValue(),
                        filters   = new Array();
                        store.clearFilter();
                        store.filter('member', value);
                        filters.push(
                            property : 'member', 
                            value    : value
                          );
                        store.loadPage(1, 
                            filters  : filters
                        ); 
                       
                    ,
                    failure: function()
                        console.log('Unable to delete');
                    
                );           
                                     
                 
    );                    
       

);

如何检索其余的相关行........

这是我的商店............

Ext.define('$pkgName.S02X001001', 
extend    : 'Ext.data.Store',
model     : '$appName.model.M02X001001',
idProperty: 'id',
autoLoad  : true,
autoSync  : true,
filterParam: 'query',
remoteSort: true,
proxy     : 
    type    : 'ajax',
    noCache : false,
    limitParam: 'limit',
    startParam: 'start',
    url : '$createLink(controller:'C02x001001', action: 'store')',
    reader:
        type            : 'json',
        root            : 'data',
        totalProperty   : 'total',
        successProperty : 'success',
        messageProperty : 'message',
        implicitIncludes: true
    ,
    simpleSortMode  : true
,
sorters: [
    property: 'id', 
    direction: 'asc'
]

);

【问题讨论】:

一个网格将自己绑定到一个商店,并将从此对所有事件作出反应。因此,当您说商店有所有记录但网格不显示它们时,这是没有意义的……您正在谈论的商店实例真的是绑定到网格的商店吗?您真的确定记录已加载到存储中吗? 是的,Sra,它发生了。我有一个检索过滤数据的网格面板。但是当我删除任何数据时,尽管我在删除功能成功的情况下再次调用了网格的存储,但网格无法更改。我在商店 (Firebug) 中找到了过滤后的数据。我的错误是什么..... 网格在这里只是一种表示层,数据在存储中。如果商店发生变化,网格将因他的绑定而改变。如果没有发生这种情况,您应该重新检查与您合作的商店的参考资料,如果商店可以红色您的回复。由于绑定,如果商店暂停他的事件,网格将无法做出反应。 Sra,最后我发现了一个轻微的关联问题,因为我正在使用 Grails+ExtJS 。因为这个网格有点神秘。现在好了。 【参考方案1】:

它应该自动刷新网格视图, 但您可以手动刷新视图:

使用方法getView().refresh(); 试试:

Ext.getCmp('sv02x00100101').getView().refresh();

【讨论】:

感谢您的回复...我尝试了您的回答.....它保持不变..网格保存以前的记录...... 也许您想先尝试记录商店记录。使用:console.log(store_name);然后观察他记录的数据(store.data.items)。如果记录是服务器响应的真实数据,则表明错误不是来自存储。 No Funckye,也许我很清楚我的需求。好。即我在一个表中有五个特定成员的数据,但有很多其他成员的数据。所以我通过过滤检索特定成员的数据,并在网格面板的视图中使用它们。所以我的网格包含特定成员的数据。现在,如果我删除该特定成员的一个数据,还剩下多少数据?应该是四个吧?数据库显示它四个。但网格显示它五个。这意味着网格不会重新加载新记录(数据库的现状)。如果我刷新我的应用程序,它会显示四个。这意味着??? 你应该添加这个'Ext.getCmp('sv02x00100101').getView().refresh();'在 onDeleteClick() 上删除记录后;

以上是关于即使在过滤时重新加载商店后网格也不会改变的主要内容,如果未能解决你的问题,请参考以下文章

提交是成功的文本即使重新加载后也不会出现

当我重新加载网格和存储时,extjs 缓存具有相同名称的图片

即使在状态更改后组件也不会更新

Ag 网格重置过滤器

产品加载到 redux 商店后,UseEffect 不会重新渲染页面

即使 DB 已正确更新,React UI 也不会在单击时重新呈现。第二次点击后,UI 重新渲染