昨天无意中在网上看到一篇讲解sencha touch组件选择器的文章,名为 Sencha touch 2通过Ext.ComponentQuery.query查找组件。

里面对组件选择器的效率讲解完全反了,说getCmp是在dom树中全文查找,效率不高,而ComponentQuery.query()效率比较高,而且该文章被很多文章采集器采集到了很多网站上。

  这里有必要纠正下,跟这边文章的描述恰恰相反,在sencha touch的组件查询中getCmp()要比ComponentQuery.query()效率高,为什么呢?

  因为在sencha touch中,当视图组件被实例化的时候,该组件对象会以键值对的形式保存在componentManager中的map对象中,

  map对象中的属性名即对应组件对象的id(在st中,如果用户没有给组件对象定义id,st会按照自己的一套规则给组件生成一个id值),而属性的值即组件对象,

  简单的说,就是map["id"] = component,下面是componentManager中注册视图组件时候的实现

  

/**
* Registers an item to be managed.
* @param {Object} component The item to register.
*/
register: function(component) {
var id = component.getId();//获取组件对象的id值 // 判断组件对象的id值在map对象中是否已存在,若存在,提示id已被使
// 用
if (this.map[id]) {
Ext.Logger.warn('Registering a component with a id (`' + id + '`) which has already been used. Please ensure the existing component has been destroyed (`Ext.Component#destroy()`.');
} //对组件对象完成注册,将组件对象保存到componentManager的
//map 对象中,属性名为id值,属性值为组件对象
this.map[component.getId()] = component;
},

  

  当我们使用getCmp(id)对组件对象进行查找时,其实是调用了componentManager中的get(id)方法,代码如下:  

get: function(id) {
return this.map[id];
}

  我们可以看到,这里其实就是直接返回了map对象中属性为id的值,通过map[id]直接查找出了对象的组件对象,没有过多的复杂查找过程

  接下来,我们再来看下Ext.ComponetQuery.query(),为什么说它的查询效率不如getCmp,

  因为它是在所有已经被保存到componentManager中的组件对象中,按照id,attribute,classname等一系列的规则判断来进行查找,

  它会先拆解你query()中传入的selector规则,经过匹配后调用对应的属性查找方法,分别有filterByXType、filterByClassName、filterByAttribute、filterById、filterByPseudo,

  而每次执行Ext.ComponentQuery.query()的时候都会调用Ext.ComponentManager.all.getArray()来查找出componentManager中所有的组件对象,然后再执行上面的各个过滤方法,由于这部门内容源码比较多,就不贴出来了,有兴趣的同学可以到ComponentQuery.js中查看源码,这里仅让大家了解下原理。

  看到上面的分析,大家应该明白为什么getCmp的效率要比ComponentQuery要高了,

  那我们到底使用getCmp呢,还是使用ComponentQuery呢,由于dom元素中id的唯一性等问题,所以官方并不推荐使用id来定义组件(注:id定义的子组件对象在绑定事件时,当组件对象被手动销毁后再重建,在使用sencha cmd打包压缩过代码后,会出现事件无效等奇葩问题,所以一般情况下,我最多只会给父组件定义id),而是使用itemId来定义组件,itemId并不会存在于dom元素中,而是跟对应的组件对象绑定在一起只存在于内存中,itemId的查找只有使用ComponentQuery.query(#itemId),或是组件的down(),up()等方法来查找,所以,在实际开发中,Ext.ComponentQuery.query()使用得较多。

  而在性能上我做过测试,Ext.ComponetQuery.query()在组件较多的情况下执行效率跟getCmp()相比最多相差几十ms,getCmp的执行速度一般是0ms-1ms,所以性能上其实影响不大,组件少的情况下,只会差几ms。

  功能上,ComponentQuery查找出来的是数组,getCmp查出的是唯一对象,

  所以实际开发中,大家根据自己的实际情况来使用这两个查询方法,两者各有优劣。

  

sencha touch 组件选择器getCmp和ComponentQuery.query()的效率解析的更多相关文章

  1. sencha touch 选择器

    1 DOM元素选择器 Ext.DomQuery操作标准DOM元素 Ext.query(selector, [root]) : HTMLElement[] // 调用Ext.dom.Query.sele ...

  2. sencha touch 扩展篇之使用sass自定义主题样式 (下)通过css修改官方组件样式以及自定义图标

    上一讲我们讲解了如何使用官方的api来修改主题样式,这讲我们继续讲解sass的样式修改, 编译官方自带的主题包  在生成的项目以及官方sdk的目录下,自带了一些主题sass包,我们也可以通过修改sas ...

  3. Ext.ComponentQuery.query()

    转载:http://blog.csdn.net/jiushuai/article/details/7938476 用来找特点的所有容器(Ext.container.Container)或是通过Ext. ...

  4. 俺的新书《Sencha Touch实战》终于出版了

    内容简介:Sencha框架是第一个基于HTML 5的移动也能给予框架,可以让Web应用看起来像网络应用.美丽的用户 界面 组件和丰富的数据管理,全部基于最新的HTML 5和CSS 3的Web标准,全部 ...

  5. 【转载】Sencha Touch 提高篇 组件选择器

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:威老     原文地址:http://www.cnblogs.com/weil ...

  6. sencha touch 入门系列 (九)sencha touch 视图组件简介

    对于一个普通用户来说,你的项目就是一组简单的视图集合,用户直接通过跟视图进行交互来操作你的应用,对于一个开发人员来说,视图是一个项目的入口,虽然大部分时候最有价值的部分是在model层和control ...

  7. Sencha Touch id 和 itemId

    通过id获得组件: var view=Ext.getCmp('id'); 通过itemId获得组件: var view = ComponentQuery.query('view_xtype'), // ...

  8. 【翻译】在Ext JS和Sencha Touch中创建自己定义布局

    原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...

  9. 【翻译】在Ext JS和Sencha Touch中创建自定义布局

    原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...

随机推荐

  1. C/C++捕获段错误,打印出错的具体位置(精确到哪一行)_转

    转自:C/C++捕获段错误,打印出错的具体位置(精确到哪一行) 修订:2013-02-16 其实还可以使用 glibc 的 backtrace_symbols 函数,把栈帧各返回地址里面的数字地址翻译 ...

  2. KafkaStream实现wordcount

    KTable应用 KTable wordCounts = textLines // Split each text line, by whitespace, into words. .flatMapV ...

  3. Hibernate-HQL&QBC基础使用(分页)

    @Test public void testHql() { Configuration configuration = new Configuration().configure(); Session ...

  4. C#程序运行流程

    我们写好的C#代码操作系统是如何能识别呢,我们都知道操作系统只能认识二进制 机器代码,下面用图来表示 因为C#是安全的托管代码 同时CLR会在内存中创建应用程序域 托管代码:被CLR管理的代码 非托管 ...

  5. jQuery的Cookie操作插件

    jQuery的cookie插件 01 // jQuery.cookie.js 02 jQuery.cookie = function(name, value, options) { 03     if ...

  6. 关于Unity中的光照(一)

    一.光源定义 光源,是一个普通节点加一个Light组件,创建的时候可以直接创建光源节点,也可以先创建一个空节点,再添加Light组件实例. 二.颜色形成 看到的物体颜色受两个很重要的因素的影响,一个是 ...

  7. NET Core 环境搭建和命令行CLI入门[转]

      NET Core 环境搭建和命令行CLI入门 时间:2016-07-06 01:48:19      阅读:258      评论:0      收藏:0      [点我收藏+]   标签: N ...

  8. SharePoint 2010 讨论板列表内容的读取细节处理

    list.Folder表示subject,属于特殊列表,使用list.Folder遍历项,而不是使用list.Items;list.Items表示reply;list.Items[0]["P ...

  9. 最大子数组之和(N)

    int maxSum(int *array, int n) { ]; ; ; ; i < n; i++) { ) newsum += array[i]; else newsum = array[ ...

  10. MathType中常见的两种符号的运用

    想要让公式编辑得快速又高效,MathType数学公式编辑器这个神助攻是少不了的.MathType是一款专用的数学公式编辑器,用它来编辑公式非常方便实用,并且排版也非常简单.下面介绍两种常见符号的应用. ...