迁移Ext JS 4代码库时,无法覆盖Ext.data.proxy.Ajax实例上的afterRequest方法

时间:2015-04-22 11:36:02

标签: javascript extjs

背景:我希望能够为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

这里有什么问题?

2 个答案:

答案 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配置中的函数,则抛出异常。

查找Ext.Configurator

从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几乎是安全的,但不建议这样做,因为它是私有标志。

注意:许多更改都没有真正记录,只要遇到这些问题,最好查看源代码。