ExtJS 4.2.1 - 从服务器收到错误后拒绝存储中的更改

时间:2014-04-09 15:21:10

标签: extjs extjs4 extjs4.2

在我的应用程序中,我正在使用以下代码删除记录:

//try to delete item
s.eventStore.remove(s.ctx.rec);
//error handling
s.eventStore.getProxy().on({
    exception: function() {
        s.eventStore.rejectChanges();
        Ext.MessageBox.show({
            title: 'Server error',
            msg: 'data restored',
            icon: Ext.MessageBox.ERROR,
            buttons: Ext.Msg.OK
        });
    }
});

这很好用,但我想避免在每个地方添加听众,而是想在我的商店中添加一个听众。
我试过像这样修改我的商店:

Ext.define('Urlopy.Store.Holidays', {
    extend: "Sch.data.EventStore",
    autoLoad: false,//zmiana
    autoSync: true,
    batch: false,
    proxy: {
        type: 'rest',
        pageParam: false, //to remove param "page"
        startParam: false, //to remove param "start"
        limitParam: false, //to remove param "limit"
        noCache: false, //to remove param "_dc"
        url: window.appUrl + 'api/Holidays',
        reader: {
            type: 'json',
            root: 'data'
        },
        writer: {
            type: 'json'
        },
        listeners: {
            exception: function (store, response, operation) {
                    var data = Ext.decode(response.responseText);
                    Ext.MessageBox.show({
                        title: 'Server error',
                        msg: data.Message,
                        icon: Ext.MessageBox.ERROR,
                        buttons: Ext.Msg.OK
                    });
                    store.rejectChanges();
            }
        }
    },
    model: 'Urlopy.Model.Holiday'
});

这基本上是相同的监听器,但是当我尝试拒绝改变时,我得到了这个错误:

Uncaught TypeError: Object [object Object] has no method 'rejectChanges'

如果服务器出现问题,如何修改我的商店以进行全局异常处理和恢复事件?

我不想使用Cancel store.remove after server call in ExtJS 4的解决方案(store.add(store.getRemovedRecords());)

修改

我已将我的stode定义更新为:

Ext.define('Urlopy.Store.Holidays', {
    extend: "Sch.data.EventStore",
    autoLoad: false,
    autoSync: true,
    batch: false,
    proxy: {
        type: 'rest',
        pageParam: false, //to remove param "page"
        startParam: false, //to remove param "start"
        limitParam: false, //to remove param "limit"
        noCache: false, //to remove param "_dc"
        url: window.appUrl + 'api/Holidays',
        reader: {
            type: 'json',
            root: 'data'
        },
        writer: {
            type: 'json'
        },
        listeners: {
            exception: function(proxy, response, operation) {

                console.log(this);
                this.rejectChanges();
            },
            scope: this
        }
    },
    model: 'Urlopy.Model.Holiday'
});

但我仍然得到相同的错误和控制台输出Window对象而不是store。

5 个答案:

答案 0 :(得分:3)

rejecting每个record of the operation怎么样?

listeners: {
  exception: function(proxy, request, operation, eOpts){
    // ... any user notification ...

    Ext.each(operation.getRecords(), function(record){
      record.reject();
    });
  }
}

PS:这对ExtJS 5.x也有效(基本模型内部通常可用于整个应用程序)!

答案 1 :(得分:1)

这应该从控制器处理。如果对同步方法的调用失败,则会触发失败回调,您可以拒绝更改。

store.sync({
  failure : function(){
     store.rejectChanges();
  }
});

答案 2 :(得分:0)

异常事件的签名是:

exception( this, response, operation, eOpts )

其中this是代理。你需要添加一个范围:

listeners: {
    exception: function (proxy, response, operation) {
        var data = Ext.decode(response.responseText);
        Ext.MessageBox.show({
            title: 'Server error',
            msg: data.Message,
            icon: Ext.MessageBox.ERROR,
            buttons: Ext.Msg.OK
        });
        this.rejectChanges();
    },
    scope: this
}

它应该有用,this应该是商店。

答案 3 :(得分:0)

新想法:

您可以直接破坏记录,model.destroy()有一个operation参数,您可以在其中添加failure功能。

答案 4 :(得分:0)

在您的商店内部代理中添加该异常的侦听器。下面是一个示例,在异常时获取响应消息并填充弹出窗口并拒绝更改。

     listeners: {
             exception: function (proxy, response, operation, eOpts){
                 var data = Ext.decode(response.responseText);
                 Ext.MessageBox.alert('Error', 'The proxy event failed: <br><li>'+data.errorMessage+'</li>');
                 Ext.each(operation.getRecords(), function(record){
                     record.reject();
                 });
             }
         }