在ExtJS项目开发中,每个组件都必须拥有唯一的ID——这是基本底线,而非可选建议。一旦ID重复,各种难以理解的错误就会不断出现,而且诊断起来往往极为棘手。
根本原因在于:ExtJS底层主要依赖ID来识别和管理组件。假设panel1里有一个ID为"keyword"的文本框,panel2中又存在相同ID的文本框。当你关闭panel2时,ExtJS发现这个ID在panel1中依然“存活”,于是不会销毁该对象——结果它变成了一具“僵尸”,孤立无援地滞留在内存中,导致后续查询、事件绑定全部混乱。此类问题很难通过常规调试发现,因为表面上看代码逻辑并无异常。
那么,如何确保组件ID永不冲突?两种主流方案,各有适用场景。
方法一:主动省略ID,借助其他属性定位组件。比如通过组件的find方法,传入其他唯一属性(如name)来进行定位:find("name","role")会返回一个数组,如果name是唯一的,直接取[0]即可。这种方式的优势是从根本上规避了ID冲突,但缺点是需要额外依赖另一个唯一属性,而且代码可读性会稍弱一些。
方法二:采用“父组件ID + 子组件标识”的组合命名方式。这实际上是ExtJS内部也采用的做法。比如子组件的ID可以写成 this.id + "_role",这里的this就是父组件。由于父组件的ID必定唯一,那么它的所有子组件ID也就自然唯一了。即使同一个组件被实例化两次,两个实例的子组件也不会撞ID。这种方案更贴近框架的设计哲学,也是更推荐的做法。
总而言之,牢记一条原则:无论在什么时候、什么场景下,组件的ID都不能重复。要么主动使用组合ID,要么完全放弃ID转而采用属性查找。没有第三条路——否则等到线上出现难以复现的诡异Bug时,后悔莫及。
