《Ext JS实战》——2.3 使用Template和XTemplate

简介: Ext.Template是一个很强大的核心工具,借助它可以创建一个预先留好插槽的DOM层次结构,以后再用数据填补这些插槽。一旦定义好了模板,可以用它复制出一个或者多个预定义好的DOM结构,并用数据填充这些插槽。

本节书摘来自异步社区《Ext JS实战》一书中的第2章,第2.3节,作者:【美】Jesus Garcia著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.3 使用Template和XTemplate

Ext.Template是一个很强大的核心工具,借助它可以创建一个预先留好插槽的DOM层次结构,以后再用数据填补这些插槽。一旦定义好了模板,可以用它复制出一个或者多个预定义好的DOM结构,并用数据填充这些插槽。精通模板有助于用模板管理UI部件,例如GridPanel、DataView和ComboBox。

2.3.1 模板练习
先从创建一个相当简单的模板开始,然后继续创建一个更加复杂的模板。

screenshot
这个例子中,创建了Ext.Template的一个实例,这个模板的内容是一个预留着插槽的div字符串,插槽就是一对大括号和它围起来的内容,这里使用变量myTpl引用这个模板。现在可以调用myTpl.append了,传给它的是目标元素document.body以及用来填充插槽的数据,在这个例子中就是一个只有一个元素的数组,数组的内容是姓名。

这里连续调了3次,结果就是在DOM中加了3个div,各自的插槽中填的都是不同的名字。图2-6所示的就是添加后的结果。

screenshot

图2-6 用第一个模板给DOM添加节点后从Firebug中看到的结果

已经看到了,文档内容中添加了3个div,每个都有不同的名字。使用模板的好处显而易见。模板只需要设置一次,然后用不同的值填充到DOM中。

在前一个例子中,花括号里的插槽是个整数,传入的也是一个只有一个元素的数组。模板也可以用简单对象的key/value映射。下面这段代码就是创建了这样一个模板的语法,如代码2-1所示。

代码2-1 创建一个复杂的模板

screenshot

对于这个复杂模板的创建代码1方法个dBodyment.htmlNodes[n])更费时事件首先注意到的可能是传入的是几个参数,这是因为在创建模板时,这种用tab分隔样式的伪HTML代码看起来要比一个长字符串容易阅读。Ext开发人员要喜欢这个方式, Template构造函数会接收所有的传入参数,而不管有多少个。

这个模板的伪HTML代码中,有4个数据点的槽位。第一个是color,这个用于元素的背景。其他3个数据点分别是name、age和dob,在添加这个模板时可以立即看到效果。

接着,对这个模板进行编译(Compile)2,这么做会通过减少正则表达式的开销加速不少。从技术上来说,就这么两个操作没有编译的必要,因为感觉不到速度上有什么好处,不过如果是一个大型的应用程序,里面可能会有很多的模板要填充,这时编译就很有用处了。出于安全起见,每次实例化之后我总是要对模板进行编译。

最后,调用了两次append3,同时传入了一个元素引用和数据对象。与在第一个模板示例中看到的不同,传入的不再是数组,而是一个数据对象,这个对象的键正好和模板中槽位相匹配。图2-7就显示了这个复杂的模板在Firebug的DOM视图中的效果。

screenshot

图2-7 这个复杂的模板在Firebug的DOM视图中看到的效果

通过使用模板,可以得到两个不同风格的DOM元素。如果有一个对象数组该怎么办呢?例如,如果一个Ajax请求返回的是一个数据对象数组,难道要对每个数据对象使用模板吗?一个方法就是对数组进行遍历,一个普通的for循环就能做到这点,而更健壮的方式使用Ext.each方法。但我不会用这种方法,相反地我会使用XTemplate,这样代码会更加清晰。

2.3.2 用XTemplate循环
从技术上说,XTemplate也可以用于一个数据对象,不过用它循环处理一个数据数组会更容易。XTemplate本身也是扩展自Template,并且并且mplateebody功能更强。我们的探讨会从创建一个数据对象数组开始,然后创建一个XTemplate,再用后者生成一段HTML代码,如代码2-2所示。

代码2-2 使用XTemplate循环处理数据
screenshot

在这段代码中,首先创建了一个数据对象数组1,这个数组和上一个模板中的数据对象类似,增加的cars也是个数组,接下来的例子就要用到这个数组。

接下来,创建了一个XTemplate的实例2,看起来和上一个模板的配置也很像,所不同的是用一个定制的tpl标签把div容器封装起来,这个tpl标签有个属性for,值是“. ”3。tpl标签相当于是模板的一个逻辑或行为修饰符,它有两个操作符,for和if,这两个操作符会调整XTemplate生成HTML内容的方式。在这个例子中,“. ”这个值告诉XTemplate从这个数组的根开始遍历,并按照tpl标签封装的伪HTML代码生成HTML内容。如果查看渲染后的HTML,会看到DOM中根本没有tpl标签。最后的结果和Template例子中是一样的,如图2-8所示。

screenshot

记住,这个例子中使用XTemplate所带来的好处是不用再写循环遍历对象数组的代码了,这些工作都由框架替我们完成了。XTemplate的功能不仅仅是遍历数组,它的用途还很多。

2.3.3 XTemplate的高级用途
我们还可以通过配置XTemplate实现对数组内的数组的遍历,甚至可以加上条件逻辑。下面这段代码就演示了XTemplate的灵活程度,并演示了许多高级概念,如代码2-3所示。有些语法对你来说可能是陌生的。不要害怕,我会一一道来。

代码2-3 XTemplate的高级用途

screenshot

这一部分用到了XTemplate的一些高级概念,第一个就是循环中的循环1。记住,for属性让XTemplate遍历一个列表。在这个例子中,for属性值是'cars',这不同于第一个属性值“. ”。这是告诉XTemplate对每一个car遍历这个伪HTML代码块。记住,cars本身也是一个字符串数组。

在这个循环中是一个“{.}”字符串,这其实是告诉XTemplate把对数组循环遍历所获得的当前值放到这里。简单地说,就是把car的名字放在这里。

接下来,看到的是一个带有if属性3的tpl行为修饰器,即传入values并执行this.isCamry。this.isCamry方法是在XTemplate的最后生成的5。这里我们多说一点。if属性很像是if条件,如果if条件能够满足,XTemplate就会产生HTML片段。就这个例子而言,要生成在tpl标签中的内容,this.isCamry必须返回true。

Values属性是对遍历的数组中的值的引用,由于遍历的是一个字符串数组,所以这个引用的就是一个字符串,也就是汽车的名字。

接下来同样执行任意的JavaScript代码4。凡是放在花括号和方括号({[…JS 代码]})里面的任何内容都会被当做普通的JavaScript;这些代码可以访问XTemplate提供的局部变量,而且可以在每次循环中修改它们。这个例子中,检查的是当前索引值(xindex)是否小于数组的元素个数(xcount),根据检查结果返回一个逗号空格或者一个空字符串。这个内联测试能够确保汽车名字的后面正确地加上逗号。

最后一个有趣的内容是带有isCamry方法的对象5。在XTemplate的构造器中传入一个带有若干成员的对象(或者对象引用),可以保证在这个XTemplate中可以直接使用这些成员。这也是为什么能在tpl的行为修饰符为元素if条件中可以直接使用this.isCamry。所有这些成员方法都是在它们所传入的XTemplate实例的作用域内调用的。这个概念非常强,不过也很危险,因为有可能会覆盖已有的XTemplate成员,因此一定要确保方法或者属性是唯一的。IsCamry方法用JavaScript的简写形式测试传入的字符串car,如果等于“Camry”则返回true,否则返回false。图2-9所示为这个高级XTemplate的结果。

screenshot

这个高级XTemplate练习的结果显示,这里行为注入确实已经如愿以偿。所有的汽车都罗列出来了,逗号也正确地加上了。可以看到注入的JavaScript工作了,因为Camry的右侧被加上了“(some car)”。

就像所看到的,Template和XTemplate和普通的用Ext.Element填充HTML内容比较起来明显好得多。我建议你仔细地看一下Template和XTemplate的API文档,更详细地了解使用这些工具的例子。等后面谈到如何创建一个自定义的ComboBox时,还会探讨Template的用法。

相关文章
|
2月前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理与实战
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理与实战
|
21天前
Next.js 实战 (二):搭建 Layouts 基础排版布局
本文介绍了作者在Next.js v15.x版本发布后,对一个旧项目的重构过程。文章详细说明了项目开发规范配置、UI组件库选择(最终选择了Ant-Design)、以及使用Ant Design的Layout组件实现中后台布局的方法。文末展示了布局的初步效果,并提供了GitHub仓库链接供读者参考学习。
Next.js 实战 (二):搭建 Layouts 基础排版布局
|
15天前
|
存储 网络架构
Next.js 实战 (四):i18n 国际化的最优方案实践
这篇文章介绍了Next.js国际化方案,作者对比了网上常见的方案并提出了自己的需求:不破坏应用程序的目录结构和路由。文章推荐使用next-intl库来实现国际化,并提供了详细的安装步骤和代码示例。作者实现了国际化切换时不改变路由,并把当前语言的key存储到浏览器cookie中,使得刷新浏览器后语言不会失效。最后,文章总结了这种国际化方案的优势,并提供Github仓库链接供读者参考。
|
16天前
Next.js 实战 (三):优雅的实现暗黑主题模式
这篇文章介绍了在Next.js中实现暗黑模式的具体步骤。首先,需要安装next-themes库。然后,在/components/ThemeProvider/index.tsx文件中新增ThemeProvider组件,并在/app/layout.tsx文件中注入该组件。如果想要加入过渡动画,可以修改代码实现主题切换时的动画效果。最后,需要在需要的位置引入ThemeModeButton组件,实现暗黑模式的切换。
|
1月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
29 2
|
2月前
|
JavaScript 前端开发 开发者
探索JavaScript原型链:深入理解与实战应用
【10月更文挑战第21天】探索JavaScript原型链:深入理解与实战应用
39 1
|
2月前
|
SQL 前端开发 JavaScript
Nest.js 实战 (十五):前后端分离项目部署的最佳实践
这篇文章介绍了如何使用现代前端框架Vue3和后端Node.js框架Nest.js实现的前后端分离架构的应用,并将其部署到生产环境。文章涵盖了准备阶段,包括云服务器的设置、1Panel面板的安装、数据库的安装、域名的实名认证和备案、SSL证书的申请。在部署Node服务环节,包括了Node.js环境的创建、数据库的配置、用户名和密码的设置、网站信息的填写、静态网站的部署、反向代理的配置以及可能遇到的常见问题。最后,作者总结了部署经验,并希望对读者有所帮助。
212 11
|
2月前
|
存储 JavaScript 前端开发
前端开发:Vue.js入门与实战
【10月更文挑战第9天】前端开发:Vue.js入门与实战
|
1月前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
49 0
|
2月前
|
前端开发 网络协议
Nest.js 实战 (十四):如何获取客户端真实 IP
这篇文章介绍了在Nest.js应用中获取客户端真实IP地址的问题及解决方法。问题出现在使用本地代理时,请求的IP地址总是返回::1或::ffff:127.0.0.1。为解决这个问题,需要确保代理服务器正确设置转发头如X-Forwarded-For或X-Real-IP,后端服务能够读取这些头信息来确定客户端的IP地址。文章以作者自己的OpenResty应用为例,展示了如何通过配置反向代理和设置X-Forwarded-For头来获取真实IP地址,并提供了相关的代码示例。最后,文章提到了使用这个解决方案后的实际效果,例如在操作日志中记录真实IP地址。
117 0