在我的应用程序中,我正在使用以下代码删除记录:
//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。
答案 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();
});
}
}