在 ext js 中的按钮单击事件上从网格和数据库中删除记录

Posted

技术标签:

【中文标题】在 ext js 中的按钮单击事件上从网格和数据库中删除记录【英文标题】:delete a record from grid and database on button click event in ext js 【发布时间】:2011-04-18 12:29:45 【问题描述】:

我正在使用带有 ruby​​ on rails 的 ext js 设计器。 我想在按钮单击事件中从我的网格和数据库中删除一条记录。 谁能帮我? 谢谢...

以下是我的网格的代码。

            xtype: 'grid',
            title: 'Products',
            store: 'productMaster',
            height: 176,
            id:'mygrid',
            name:'mygrid',
            sm: new Ext.grid.RowSelectionModel(
                    singleSelect: true,
                    listeners: 
                           rowselect: function(sm, row, rec) 
                           Ext.getCmp("myform").getForm().loadRecord(rec);
                                                              
                           
                    ),
            columns: [
                
                    xtype: 'gridcolumn',
                    dataIndex: 'name',
                    header: 'name',
                    sortable: true,
                    width: 100
                ,
                
                    xtype: 'gridcolumn',
                    dataIndex: 'price',
                    header: 'price',
                    sortable: true,
                    width: 100
                ,
                
                    xtype: 'gridcolumn',
                    dataIndex: 'category',
                    header: 'category',
                    sortable: true,
                    width: 100
                ,

以下是我的删除按钮代码

             bbar: 
                xtype: 'toolbar',
                height: 30,
                items: [
                    
                        xtype: 'button',
                        text: 'Delete',
                        width: 100,
                        height: 30,
                        id:'btnDelete',
                        handler: function() 

                                //alert('trying to delete the record...');
                                var store = Ext.getCmp("mygrid").getStore();
                                store.removeAt(store.getCount()-1);
                            

由于这个处理函数,最后一条记录 id 被删除,但它是从存储中删除而不是从数据库中删除。我希望记录也从数据库中删除...

谢谢...

【问题讨论】:

您应该在问题中包含网格的源代码。 您是否为您的商店设置了作家?如果配置正确,它应该在调用 store 上的 save 时适当地处理视图、创建、更新和删除。 【参考方案1】:

在我们开始之前:我注意到您的网格的配置对象有

xtype:'grid'

这本身就禁止任何编辑功能和服务器交互(除了读取商店),因为您正在实例化一个 Ext.grid.GridPanel,而(我认为)您需要一个 Ext.grid.EditorGridPanel。为了使以下所有内容正常运行,您应该将此行更改为:

xtype:'editorgrid'

我要检查的第一件事是商店有一个 id 配置属性,它是商店阅读器的配置列。如果 store 无法识别该记录,则认为该记录不存在,不会向服务器生成请求。

要检查的第二件事:您的商店是否已配置为生成服务器请求?也就是说,你的 store config 对象中是否有这样的一行?

proxy: new Ext.data.HttpProxy(
    api:
        read:'readscript.url',
        create:'insertscript.url',
        update:'updatescript.url',
        destroy:'deletescript.url'
    
)

接下来,您是否在商店配置对象中定义了“writer”属性? 存储配置对象应具有 proxywriter 属性,以便在删除时生成正确的服务器请求。

要为商店指定一个作家,你可以简单地写(对于一个普通的 Json 作家):

writer: new Ext.data.JsonWriter()

并且存储会将所有适当的写入请求发送到服务器。

另一个痛苦的(我认为没有很好的记录)问题可能是商店阅读器中存在必填字段。默认情况下,所有列都是必需的;要将列标记为“非强制性”,您必须指定(在存储阅读器列数组中):

name:'column_name', allowBlank:true, /* other stuff like 'type' etc. */ 

很可能,当您向网格添加新记录时,并非所有列都会被填充。 在填充所有必填列之前,商店不会生成服务器创建请求。然后,如果您删除了一条未保存的记录,存储将不会生成销毁请求,因为它会假定该记录“不存在”。

【讨论】:

非常感谢。但是网格的“代理”元素给了我一些错误。但我已经通过使用一个小的 ajax 代码解决了这个问题。 var g1 =Ext.getCmp('mygrid'); var dataid= g1.getSelectionModel().getSelected().id; Ext.Ajax.request( url: '/products/'+dataid, method: 'DELETE', params: 'data[id]':dataid );

以上是关于在 ext js 中的按钮单击事件上从网格和数据库中删除记录的主要内容,如果未能解决你的问题,请参考以下文章

在Ext JS中捕获网格行的长按或点击保持事件

Ext JS 模拟单击​​网格的下一个单元格

EXT JS - 单击传输记录以存储弹出网格面板

Ext JS 网格面板事件

当我们将 Telerik 网格与 LinqDataSource 一起使用时,如何在页面的各种按钮单击事件上重新生成网格数据

从 c# windows 应用程序中的按钮单击将值返回到网格