ExtJS in Review - xtype vs. alias

  今天在帮一个兄弟检查一段自定义控件的代码时觉得他对xtype以及alias的使用和ExtJS各示例代码的使用有较多的不一致,而我自己也不是很清楚使用这两个属性时的最佳方法。因此在回家后整理出了这样一篇文档。一方面用来标准化我们自己的代码,另一方面也共享给大家,毕竟对这两个属性进行详细讨论的资料几乎没有。

xtype

  首先来看看xtype的定义。在ExtJS的官方文档中是这样对它进行定义的:

  This property provides a shorter alternative to creating objects than using a full class name. Using xtype is the most common way to define component instances, especially in a container.

  也就是说,在定义一个类的时候,如果我们指定了它的xtype,那么我们就可以通过这个xtype,而不是类型的全名来创建这些类型。例如对于下面的布局声明:

1 items: [
2     Ext.create(‘Ext.form.field.Text‘, {
3         fieldLabel: ‘Foo‘
4     }),
5     ……
6 ]

  其与以下使用xtype声明的布局是等同的:

1 items: [
2     {
3         xtype: ‘textfield‘,
4         fieldLabel: ‘Foo‘
5     },
6     ……..
7 ]

  可以看到,在使用xtype的时候,我们可以不再标明类型的全名,进而减少了在使用它们时出错的可能,降低了维护的成本。

  而在定义一个类型的时候,我们可以指定该类型所具有的xtype:

1 Ext.define(‘MyApp.PressMeButton‘, {
2     extend: ‘Ext.button.Button‘,
3     xtype: ‘pressmebutton‘,
4     text: ‘Press Me‘
5 });

alias

  而在文档中,alias的定义则如下所示:

  List of short aliases for class names. An alias consists of a namespace and a name concatenated by a period as <namespace>.<name>

namespace - The namespace describes what kind of alias this is and must be all lowercase.

name - The name of the alias which allows the lazy-instantiation via the alias. The name shouldn‘t contain any periods.

  在一个类型定义中,我们可以指定它所使用的alias:

1 Ext.define(‘MyApp.CoolPanel‘, {
2     extend: ‘Ext.panel.Panel‘,
3     alias: [‘widget.coolpanel‘],
4     title: ‘Yeah!‘
5 });

  而对这个类型的使用也非常简单,在xtype中标示该alias即可:

1 Ext.widget(‘panel‘, {
2     items: [
3         {xtype: ‘coolpanel‘, html: ‘Foo‘},
4         {xtype: ‘coolpanel‘, html: ‘Bar‘}
5     ]
6 });

xtype vs. alias

  可以看到,xtype和alias有点像,是吧?那么它们两个有什么区别,什么时候用xtype,什么时候用alias呢?

  上面的示例也展示了一个比较有趣的事情,那就是通过alias所定义的别名“coolpanel”可以直接通过xtype引用。也就是说,xtype和alias实际上可以在一定程度上通用的。

  最终我在ClassManager类的源码中找到了一系列证据。简单地说,xtype是存在于widget命名空间下的alias。如果为一个新的UI组成声明了它的xtype,那么就等于在widget命名空间下为其声明了一个alias。例如我们也可以通过下面的代码定义刚刚看到的CoolPanel类:

1 Ext.define(‘MyApp.CoolPanel‘, {
2     extend: ‘Ext.panel.Panel‘,
3     xtype: ‘coolpanel’,
4     title: ‘Yeah!‘
5 });

  总的来说,为一个UI组成指定一个xtype实际上就等于为其指定一个在widget命名空间下的alias。但是alias所能覆盖的类型范围要比xtype广得多。一个alias不仅仅可以用来声明命名空间为widget的各个类型,更可以在plugin,proxy,layout等众多命名空间下声明类型。

  而在Sencha论坛中,一位开发人员也解释了为什么在alias已经存在的情况下定义一个额外的xtype。这仅仅是为了提高性能。在ExtJS的内部实现中常常需要将alias中的命名空间剥离才能得到所需要创建的widget类型。在xtype的帮助下,ExtJS可以摆脱掉耗时的字符串分析工作,从而提高性能。

  因此在定义一个自定义widget的时候,我们应当使用xtype,而在定义其它组成时,我们就不得不使用alias了。由于所有的widget使用同一个命名空间,因此我们需要在为自定义widget指定xtype时标示一个前缀,例如在项目egoods中定义的一个自定义button的xtype就应为egoods-button。

References

  本文章中所有示例均来自于ExtJS官方文档:http://docs.sencha.com/extjs/5.1/5.1.0-apidocs/

时间: 2024-12-30 03:38:56

ExtJS in Review - xtype vs. alias的相关文章

ExtJs xtype类型介绍

自定义组件在定义的时候可以通过xtype配置为组件指定xtype短名称,此后创建对象可以通过xtype来创建自定义对象了,示例代码如下: Ext.define('MyApp.PressMeButton', { extend: 'Ext.button.Button', xtype: 'pressmebutton',//指定自定义组件的xtype text: 'Press Me' }); 基本组件: xtype Class 描述 button Ext.Button 按钮 splitbutton Ex

ExtJS Complex data binding

我们先看一下效果图 视图方面有一个container,包含了4个组件,一个grid(Editable Grid),一个form(Form),一个view(DataView),一个panel(DataPanel) 四个组件之间通过一个controller来根据各个组件的事件进行数据的同步显示. 数据存在于store,store又用到一个model. app/view/MainView.js ----- container app/view/PersonDataView.js ------- Dat

[EXTJS5学习笔记]第二十六节 在eclipse/myeclipse中使用sencha extjs的插件

本文地址:http://blog.csdn.net/sushengmiyan/article/details/40507383 插件下载: http://download.csdn.net/detail/sushengmiyan/8085851 本文作者:sushengmiyan -------------------------------------------------------------------------------------------------------------

构建施耐德楼控系统数据库后台服务器示例工程三(Web端展示)

最近看到Extjs的示例中有仿操作系统桌面的代码,并且展示效果很美观,结合楼控这个系统的Web端展示需求,目前前端采用Extjs.楼控相关的操作会设计成桌面中的不同应用. Extjs初次入手看起来很复杂,但是由于其自带的示例代码很丰富,通常在了解一些基本概念后,参照着示例代码一步一步去做,我认为是最好的学习方式了. 目前我参照着Extjs中仿照桌面的示例代码,做出了如下的画面: 从图中我们可以看出,我目前在仿照着这个示例代码中的GridPanel.TabPanel.Window这些基本的组件,做

ExtJS4.2学习(21)动态菜单与表格数据展示操作总结篇2

运行效果: 此文介绍了根据操作左侧菜单在右面板展示相应内容. 一.主页 先看一下跳转主页的方式:由在webapp根目录下的index.jsp跳转至demo的index.jsp 下面是demo的index.jsp的代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% response.setHeade

MyBatis批量删除 多态sql,构建in语句

<!--==========================删除==================================== -->    <delete id="delete" parameterType="list">        <![CDATA[            delete t_vehicle_motorcade where fid in        ]]>        <foreach c

在SqlMapConfig.xml 中&lt;typeAliases&gt;与&lt;properties&gt;的关系

先来个正确的写法 <properties resource="jdbc.properties"/> <!-- 设置别名 --> <typeAliases> <!-- <typeAlias type="com.mybatis.review.entity.User" alias="User"/> --> <package name="com.mybatis.review&qu

ExtJS Alias, xtype and widget

Description What is exactly the relationship between these three different concepts? I know that if you alias a class bywidget.name you can later use it by specifying xtype: 'name'. The same class can also be initialized byExt.widget('name'). But wha

【ExtJS】关于alias和xtype

alias 在api里的解释为:别名 类名称简短的别名列表.多数用于定义xtypes 1 Ext.define('MyApp.Panel', { 2 extend: 'Ext.panel.Panel', 3 alias: 'widget.mypanel', 4 title: 'MyPanel' 5 }); 6 7 Ext.onReady(function(){ 8 // 使用 Ext.create 9 Ext.create('widget.mypanel',{ 10 html: 'Create