昨天无意中在网上看到一篇讲解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. DataGridView使用技巧四:删除行操作

    一.无条件的删除行 默认时,DataGridView是允许用户进行行的删除操作,选中要删除的行,按Delete键可以删除,该操作没有任何提示(只是删除界面显示的数据,不会真实删除数据库中的数据).如果 ...

  2. C#捕获鼠标消息

    在C#中怎样禁用鼠标按键,我们可以通过ImessageFilter接口下的PreFilterMessage方法.Application类的AddMessageFilter方法,RemoveMessag ...

  3. java-jdbc循环设置sql参数

    PreparedStatement sta=null; Connection conn=null; @Test public void Test2() { //获取连接池 ComboPooledDat ...

  4. CodeIgniter(3.1.4)框架-url重写,去除index.php

    1.开启Apache重写url模块. *相应内容可百度. 2.在项目根目录下创建[.htaccess]文件,其内容如下: RewriteEngine On RewriteCond %{REQUEST_ ...

  5. archdexls主题游戏页面game-play.php有评论时,报错( ! ) Warning: printf(): Too few arguments in D:\wamp\www\wp-content\themes\arcadexls\games-play.php on line 97

    ( ! ) Warning: printf(): Too few arguments in D:\wamp\www\wp-content\themes\arcadexls\games-play.php ...

  6. am335x watchdog

    am335x watchdog 内核文档kernel/Documentation/watchdog Qt@aplex:~/kernel/7109/linux-3.2.0/Documentation/w ...

  7. Python3.4下使用sqlalchemy

    一. 1.用sudo apt-get install python3-numpy之后,会默认把numpy安装到  /usr/lib/python3/dist-packages目录下,而且版本比较低. ...

  8. luasql在Fedora20下的安装与使用示例

    主要参考:http://www.boll.me/archives/614 luasql安装, 在终端通过yum命令安装: yum -y install lua-sql 接下来写个测试的lua脚本文件( ...

  9. android 沉浸式状态栏(像ios那样的状态栏与应用统一颜色样式)

    这个特性是andorid4.4支持的,最少要api19才干够使用.以下介绍一下使用的方法,很得简单: 添加一个demo源代码: https://github.com/ws123/StatusDemo ...

  10. SQL Server 2008 收缩日志(log)文件

    USE TestDB; GO ALTER DATABASE TestDB SET RECOVERY SIMPLE; --设置简单恢复模式 GO ); GO ALTER DATABASE TestDB ...