背景:我希望能够为ajax加载错误创建一个自定义错误掩码,例如。如果出现网络问题。
我正在使用以下代码创建一个新的Ext JS商店,我想用我自己的afterRequest
函数扩展其代理。
afterRequest
函数应发送afterload
事件,该事件由小部件上调用mask()
的实用程序函数使用。
var settingsStore = new Ext.data.Store({
model: 'vmSettings',
autoload: 'true',
proxy: {
type: 'ajax',
url: 'ta-debian-7-wheezy-virtualbox.json',
afterRequest: function(request, success) {
this.fireEvent('afterload', this, request, success);
return;
},
reader: {
type: 'json',
rootProperty: 'variables',
},
}
});

现在这个代码加载了我的错误与Ext JS,但在5.1上失败并显示消息:无法在Ext.data.proxy.Ajax实例上覆盖方法afterRequest
这里有什么问题?
答案 0 :(得分:4)
从@yellen发现我可以告诉自版本5.1以来,添加了严格的模式检查以限制功能覆盖。在这种情况下,我认为它可能是一个错误,因为这是一个空的回调方法,旨在被覆盖。无论如何,
可以通过向代理配置对象添加:$configStrict: false
来传递此检查。可能他们只是明确声明了这种覆盖。
这就是你的代码的样子:
var settingsStore = new Ext.data.Store({
model: 'vmSettings',
autoload: 'true',
proxy: {
$configStrict: false,
type: 'ajax',
url: 'ta-debian-7-wheezy-virtualbox.json',
afterRequest: function(request, success) {
this.fireEvent('afterload', this, request, success);
return;
},
reader: {
type: 'json',
rootProperty: 'variables',
},
}
});
有关$ configStrict here的更多信息。
找一个工作小提琴here。
答案 1 :(得分:3)
afterRequest是一个空函数
来自文件 -
这是一种模板方法。这个功能的钩子 类。可以在子类中轻松覆盖它。
来自源代码(5.0)
/ ** *可选的回调函数,可用于在请求完成后进行清理。 * @param {Ext.data.Request}请求Request对象 * @param {Boolean} success如果请求成功,则为true * @protected * @template * @方法 * /
**afterRequest: Ext.emptyFn,**
要覆盖此功能,您必须扩展“Ext.data.proxy.Ajax”。在子类中提供函数定义,并将商店中的子类用作代理。 FIDDLE
为什么会发生异常?
在Ext 5.1中 - 在配置类的实例期间,通过configure函数内的Configurator,对函数覆盖进行严格检查,如果函数覆盖了intance配置中的函数,则抛出异常。
从configure函数内部引发异常的类中提取(在重新配置函数中还有另一个检查) -
if (instance.$configStrict && typeof instance.self.prototype[name] ===
'function') {
// In strict mode you cannot override functions
Ext.Error.raise("Cannot override method " + name + " on " + instance.$className + " instance.");
}
将$ configStrict从true(默认)覆盖为false几乎是安全的,但不建议这样做,因为它是私有标志。
注意:许多更改都没有真正记录,只要遇到这些问题,最好查看源代码。