从商店中删除记录时(使用api)反馈用户的正确方法是啥?

Posted

技术标签:

【中文标题】从商店中删除记录时(使用api)反馈用户的正确方法是啥?【英文标题】:What's the correct way of feedback the user when a record is deleted from the store (using api)?从商店中删除记录时(使用api)反馈用户的正确方法是什么? 【发布时间】:2013-05-28 00:46:23 【问题描述】:

我正在使用一个Store,它有一个声明了api 的代理。我可以使用exception listener 处理异常,但是如何在成功删除记录时向用户发送消息?

我的商店看起来像:

Ext.define('ContatosApp.store.PsContatosStore', 
    extend: 'Ext.data.Store',

    requires: [
        'ContatosApp.model.PsContatosModel'
    ],

    constructor: function(cfg) 
        var me = this;
        cfg = cfg || ;
        me.callParent([Ext.apply(
            autoLoad: true,
            autoSync: true,
            model: 'ContatosApp.model.PsContatosModel',
            storeId: 'MyJsonStore',
            pageSize: 15,
            trailingBufferZone: 20,
            proxy: 
                type: 'ajax',
                api: 
                    read: 'contact/list',
                    create: 'contact/save',
                    update: 'contact/update',
                    destroy: 'contact/delete'
                ,
                directionParam: 'order',
                limitParam: 'max',
                startParam: 'offset',
                url: '',
                reader: 
                    type: 'json',
                    root: 'contatos'
                ,
                writer: 
                    type: 'json',
                    root: ''
                ,
                listeners: 
                    exception: 
                        fn: me.onAjaxException,
                        scope: me
                    
                
            
        , cfg)]);
    ,

    onAjaxException: function(proxy, response, operation, eOpts) 
        var data = Ext.JSON.decode(response.responseText);
        Ext.MessageBox.show(
            title: 'Error',
            msg: data.message,
            icon: Ext.MessageBox.ERROR,
            buttons: Ext.Msg.OK
        );
    

);

我的删除按钮处理程序是:

var grid = Ext.ComponentQuery.query('#MyGridPanel');
var selection = grid[0].getSelectionModel().getSelection()[0];
if (selection) 
  Ext.getStore('PsContatosStore').remove(selection);

另外,如果我从存储中删除记录,但 ajax 调用返回错误,我需要重新加载网格以再次显示记录,或者有更好的方法来处理这个问题?

【问题讨论】:

【参考方案1】:

您可以使用 requestcomplete 对所有 ajax 调用全局执行此操作。

对于特定代理,您可以使用afterRequest:

        proxy: 

            ...

            listeners: 
                exception: 
                    fn: me.onAjaxException,
                    scope: me
                
            afterRequest: function( aRequest, aSuccess ) 
                console.log( aSuccess );
            
        

【讨论】:

嗯,我添加了afterRequest,但console.log() 没有显示任何内容。我发出了警报,似乎没有触发。 绝对适合我。你确定服务器被调用并且确实返回成功吗? 以这种方式使用 afterRequest 几乎不是一个 hack。事实上,它实际上是打算使用的方式。来自文档:“这是一个模板方法。一个挂钩到这个类的功能。随意在子类中覆盖它。” docs-devel.sencha.com/extjs/4.2.1/#!/api/… 感谢您的存在。只是对于 4.1,此方法未记录在案。我已经编辑了我的答案。 好的,我最终在 onAjaxException 中使用了全局 requestcomplete + rejectChanges()。谢谢!【参考方案2】:

查看sync() 的文档。您可以传递成功和失败回调,当从服务器接收到成功响应或错误时将触发这些回调。

至于将记录放回网格中,请查看商店的 rejectChanges() 方法。我通常在我的失败回调中调用它。

【讨论】:

谢谢,sync() 工作。问题是在这种情况下我无法访问 ajax 响应。

以上是关于从商店中删除记录时(使用api)反馈用户的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从 ExtJs 4.1 存储中删除记录时会触发哪些事件

如何使用 rest API 在应用程序启动时正确初始化 Vuex 商店?

Extjs - 从商店中删除新添加的选定项目

阿波罗客户端从商店中删除而没有突变

在 Sencha Touch 1.1 中使用 AJAX 代理从商店中删除记录

检测用户是不是在 iTunes 商店中登录