ExtJS 存储添加调用创建和销毁

Posted

技术标签:

【中文标题】ExtJS 存储添加调用创建和销毁【英文标题】:ExtJS store add calls both create and destroy 【发布时间】:2014-10-15 17:52:46 【问题描述】:
                this.store = Ext.create('Ext.data.Store', 
                fields: [
                    'id',
                    'name',
                    'Address',
                    'status',
                ],
                autoLoad: auto,
                autoSync: auto,
                remoteSort: true,
                proxy: 
                    type: 'ajax',
                    api: 
                        create: '../../create.php',
                        read: '../../read.php',
                        destroy: '../../destroy.php',
                        update: '../../update.php'
                    ,
                    reader: 
                        type: 'json',
                        root: '__data',
                        totalProperty: 'grandTotal'
                    ,
                    writer: 
                        type: 'json',
                        root: '__data'
                    ,
                    listeners: 
                        exception: function( t, response, op ) 
                            var _da = Ext.decode( response.responseText );
                            if( _da ) 
                                if( _da.message == "ExistingName" ) 
                                    _da.message = Locale.gettext('name already exists');
                                     else 
                                        frm = _self.subnetEditor.down('form');
                                        name_field = frm.down('textfield[name=name]');
                                    
                                    name_field.markInvalid(Locale.gettext(_da.message));
                                
                                showMsg( _da.success, _da.message );
                                if( op.action == 'create' || op.action == 'update' ) 
                                    _self.store.rejectChanges();
                                    _self.store.load();
                                
                            
                        
                    
                
            );

这是调用四个php文件做CRUD的store,还有一些监听器来处理重名。

        removeSelected: function() 
        var _self = this;
        Ext.Msg.show( 
            title: Locale.gettext( 'Remove selected?' ),
            msg: Locale.gettext( 'Are you sure you want to remove ALL SELECTED items?' ),
            icon: Ext.Msg.WARNING,
            buttons: Ext.Msg.OKCANCEL,
            buttonAlign: 'right',
            fn: function( button ) 
                if( button == 'ok' ) 
                    var grid = _self.down( 'grid' );
                    if( grid ) 
                        var selection = grid.getSelectionModel().getSelection();
                        if( selection.length ) 
                            _self.store.remove( selection );
                            if( _self.useGridRowEditing ) 
                                _self.store.sync();
                            
                        
                    
                
            
         );
    

这里是删除功能将删除选定的项目,我有 store.add(item) 来添加记录。但问题是如果我运行 remove 函数,然后 store.add 添加任何项目,store.add 将同时触发 create 和 destroy。当我第一次运行删除功能时,第二次销毁将发布准确的数据。 我想store.add只会调用proxy中的create api,但是为什么destroy被调用了呢?

我看到 remove 引发了异常。如果抛出异常,是否意味着删除操作仍在等待中?所以它将添加和删除一起批处理?

【问题讨论】:

请记住,sync() 会将存储中的所有待处理操作批处理在一起。因此,如果您添加了 2 条记录,删除了 1 条并更新了 3 条,则调用 sync() 会将它们一起批处理 @existdissolve 不应该在调用删除后自动同步执行删除吗?如果是这样,我在删除后进行添加,它应该只剩下一个添加操作。在我的情况下,我运行 1 次删除,然后运行 ​​1 次添加,我看到它在删除时调用了销毁,在添加时调用了创建和销毁。 向服务器发送请求时是否发生错误?您能发布执行 add() 位的代码吗? 是的,删除操作总是抛出异常:'"__data":[null],"success":true,"message":"删除成功","total":1' ,这会导致它挂起吗?很奇怪,我的 PHP 在删除时没有返回任何内容,但它得到了 '[null]'。 【参考方案1】:

这不是由 ExtJS 引起的,它导致服务器响应“[null]”。 null 的数组被认为是一个异常,我猜这个异常会导致请求变得挂起。

【讨论】:

准确地说 - 这是一个第一个元素等于 null 的数组。这可能会造成严重破坏,因为这不是预期的数据。 @Thevs 我认为你是对的。为了满足我的好奇心,“浩劫”是什么意思? 我的意思是它不是您的 fields 属性的格式。 “破坏”意味着您的程序的任何意外行为:)

以上是关于ExtJS 存储添加调用创建和销毁的主要内容,如果未能解决你的问题,请参考以下文章

extjs ajax调用存储未加载

extjs 动态存储模型网格列

加载后,Extjs 在组合框存储中添加选项

ExtJS 存储/网格重置

模块化 terraform 代码想要销毁并重新创建 S3 存储桶

ExtJS json 存储未填充