今天下午本来打算完成一项功能,但是建立Extjs grid文件时出现问题报如下错误:
Uncaught TypeError: Cannot read property 'buffered' of undefined ext-all.js:38 Ext.define.initComponent ext-all.js:38 b.implement.callParent ext-all.js:38 Ext.define.initComponent MstudentList.js:22 Ext.define.constructor ext-all.js:38 b.implement.callParent ext-all.js:38 Ext.define.constructor ext-all.js:38 i ext-all.js:38 Ext.apply.widget ext-all.js:38 Ext.define.create ext-all.js:38 Ext.define.lookupComponent ext-all.js:38 Ext.define.prepareItems ext-all.js:38 Ext.define.add ext-all.js:38 Ext.define.openTab Menu.js:48 Ext.define.loadMenu Menu.js:32
这已经不是第一次遇到这个问题了,之前遇到都是把对应的文件全部删除重新建立一般即可。这次打算找到原因。由于Extjs grid已经写了不少,算是熟练了,所以可以确定文件结构没问题,而且检查一便代码没有发现明显错误。通过chrome的调试工具定位到MstudentList.js的22行,内容为:this.callParent(arguments),所以可以确定错误出现在MstudentList中,而与此相关的文件只有对应的store、model、controller和view文件。再次检查store、model确定没有错误(这两个文件很简单,一眼就能看出来),然后对view和controller进行最小化配置(只配置必须的几个属性),发现错误依旧。
使用chrome查看页面加载后的资源文件,发现MstudentLsit绑定的store文件没有加载,检查了源文件和webroot下文件发现都存在,而且使用url直接访问也可以。这是不禁郁闷了,到底是什么原因呢?就在打算放弃是突然想到Extjs的动态加载机制,会不会没有文件引入store呢?检查了下发现在MstudentLsit已经配置了store属性,这时突然想到,如果没有requires(这个相当于引入包,不同命名空间下的需要引入)对应的store文件,那么也可能不加载,而且正好会报错。一般为了方便配置extjs MVC里边习惯将所有需requires的文件放在controller配置,检查controller,终于发现错误:本来应该引入manager.user写成了admin.user,而且恰好admin下也有user,只是结构不一样。
最后归根结底一句话:粗心惹的祸!如果你遇到这个错误应该首先检查每个文件和其引入的文件命名空间是否正确,绝大多数情况下都是这个原因。