XTemplate模板学习和使用总结
XTemplate模板学习和使用总结
前言
XTemplate是我接触的第一个模板语言,用在公司的一个NodeJS项目中,跟它打交道经常是因为需要使用它的语法向模板中注入数据。因为是刚入门前端不久,所以一开始对这个语言有些抵触(毕竟不会用,还要上手写业务...),“这种我明明可以写在js文件里啊,为啥非要写在模板里??”之类。但是在了解并使用它写了一些业务之后就发现,模板语言是真的好用。
XTemplate的好处
- 首先,使用XTemplate可以很方便地使用include语法调用不同的模板。你可以将一个复杂的页面拆成几个不同的模块来写,其中很可能一些模块是可复用的,这样将来再需要这些模块时只要简单的将其include进来就好,而不必每次都重新写一遍。在浏览代码时也会显得很直观;
- 这种可拆分的特性不仅仅只是直观而已,其可维护性和可扩展性都大大提高了。业务需求变更时,只需更改涉及到的功能模块,然后所有调用这个模块的页面都会同步修改。想要增加功能时亦是如此;
- 也是因为可拆分的特性,一个项目可以方便的分由几个团队成员共同完成,每个人都可以专注于开发自己的模块,避免不必要的代码冲突,这使得开发效率大大提高;
- 就数据的导入来讲,在模板阶段导入数据和采用js文件异步方式导入数据优势各有不同。js异步加载一般是在页面在用户浏览器端加载完成时进行,也就是说页面“到达”浏览器端时是没有数据的。但这个特点并不影响js异步加载作为页面交互的主要手段。模板加载的方式就不同了,页面在“到达”用户浏览器之前就已经是加载好了的,用户不必再通过js向服务器发送请求,以加载页面的基础数据,只需要在需要交互的时候再发送请求即可,体验更加无缝;
- XTemplate对编写HTML也是非常友好的。具体在于XTemplate提供了不少非常实用的语法功能,正是在了解和使用这些功能的过程中,我逐渐改变了想法(留下了不学无术的泪水.jpg);
- 由于没有接触过其他模板引擎,所以XTemplate独立于其他模板引擎的独有特点这里就不讲了(毕竟刚入门的菜鸡)。但是就自己在工作中的使用体验来讲,XTemplate还是很好上手的,学习成本并不高。
XTemplate语法
下面着重介绍一些我在工作中经常用到的语法:
一、变量
利用这个语法可以向HTML中插入变量(数据),是一个经常会被用到的基础功能,语法如下:
{{ pageData }}
不但如此,还可以访问并取到变量的子级变量,语法和js相同:
{{ pageData.num }}
{{ pageData['num'] }}
然而,使用 {{}} 会对一些类似"<", ">"这样的字符串进行转义,显示出来就是"& lt;", "& gt;",所以如果需要引入原始数据(不被转义),就需要使用下面的语法:
{{{ pageData }}}
{{{ pageData.num }}}
如果连大括号都要保留(不被转义或误识别)的话,那就需要这样写:
{{%
{{ pageData }}
%}}
如果想添加注释呢,只需要在双括号内加一个感叹号就行了:
{{! 博主很帅(cai),大家知道就行了,不要声张}}
二、作用域
每一个模板都有一个独立的作用域,在子模板中可以访问到父模板的上下文,但是在子模板中定义或者修改变量不会影响到父模板的变量。如下所示:
parent.XTpl:
{{ set (a = 1, b = 2) }}
{{include ("sub.XTpl") }}
in parent:
a = {{ a }}
b = {{ b }}
sub.XTpl:
in sub:
{{ set b = 3 }}
a = {{ a }}
b = {{ b }}
渲染 parent.XTpl,将会得到下面的结果:
in sub:
a: 1
b: 3
in parent:
a: 1
b: 2
三、方法
在写模板的时候可以使用js自带的方法,比如数组的方法、字符串的方法都可以使用,这点非常方便。
{{ set str = '我没有钱' }}
{{ str.split('')[0] + str.split('')[2] + str.split('')[3] }} // => 我有钱
四、操作符
XTemplate支持常见的操作符,比如:加(+),减(-),乘(*),除(/),余(%),还有比较类型的:=, !, >, >=, <, <=,以及逻辑操作方面的:或(||),与(&&),非(!)等等,甚至支持三元运算符:
{{ a > b ? a : b }}
然而需要注意的是:这里面不包含""号,如果需要使用等于,必须使用全等号(=),否则会报错。
五、函数调用
如果你传递了 javascript 的方法到模板中,你可以像在 javascript 中一样使用它。比如使用预先定义并传进来的函数,将加载进模板的json数据转换为字符串,以供js文件从HTML中调取。
六、if 语句
使用if语句可以对一个或多个条件进行判断,从而根据需求的不同而显示不同的代码块。
{{# if (I'm rich) }}
Show me my money.
{{/ if }}
或者你还可以加入 elseif 语句
{{# if (I am handsome) }}
I am handsome.
{{ elseif (I am owesome) }}
I am not only handsome but also owesome.
{{ else }}
Sorry, but there is no else.
{{/ if }}
七、each 语句
使用each语句可以对数据和HTML结构进行循环,非常方便的将数据按照顺序写入到HTML结构中:
{{set (array = [{
name: "one"
}, {
name: "two"
}])}}
{{#each(array)}}
{{'第' + (xindex + 1) + '行:' + this.name}}
{{/each}}
渲染这个模版,将会得到结果:
第1行:one
第2行:two
八、include 语句
include语句用于引入其他模板:
{{ include ("item.xtpl") }}
不但如此,在引入模板时还可以传递并修改参数:
{{ set (x = "x", y = "y") }}
{{ include ("sub.xtpl", a = x, b = x)}}
渲染 parent.html 将会得到结果:
x: x
y: y
a: x
b: x
九、模板继承
模板继承可以使用户非常容易地复用模板。比如可以写一个基础模板,里面写入一些公用的内容,并且在里面定义一些block,比如header/body/footer之类,然后子模板只需要将这些block重写即可。如下:
先定义一个base.xtpl:
<!doctype html>
<html>
<head>
<meta name="charset" content="utf-8" />
<title>{{title}}</title>
{{{block ("head")}}}
</head>
<body>
{{{block ("body")}}}
</body>
</html>
再编写content.xtpl:
{{extend ("./parent")}}
{{#block ("head")}}
<link type="text/css" href="test.css" rev="stylesheet" rel="stylesheet"/>
{{/block}}
{{#block ("body")}}
<h2>{{title}}</h2>
{{/block}}
然后我们使用数据 {title: 'XTemplate'} 渲染 content.xtpl,将会得到下面的结果:
<!doctype html>
<html>
<head>
<meta name="charset" content="utf-8" />
<title>XTemplate</title>
<link type="text/css" href="test.css" rev="stylesheet" rel="stylesheet"/>
</head>
<body>
<h2>XTemplate</h2>
</body>
</html>
总结
XTemplete是博主接触的第一款模板语言,算是有了一个概念。希望将来可以不断拓展知识面,不断接触更多更好玩的东西。
XTemplate模板学习和使用总结的更多相关文章
- sencha Touch 2.4 学习之 XTemplate模板
XTemplate模板 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...
- 39.VUE学习--组件,子组件中data数据的使用,x-template模板的使用,改变for循环里的某条数据里的值
多处引用相同组件时,操作data不会相互影响 <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...
- ExtJs4 笔记(4) Ext.XTemplate 模板
ExtJs4 笔记(4) Ext.XTemplate 模板 摘自:http://www.cnblogs.com/lipan/ 本篇将涉及到ExtJs中一个重要的概念,模板.话说Razor很神奇,但是我 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- C++模板学习
一.定义函数模板 template<class T> 函数定义 举个例子比较两个数大小: template<class T> int Compare(T a,T b) { ; ...
- [转载]ExtJs4 笔记(4) Ext.XTemplate 模板
作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...
- C++模板学习随笔
本文学习内容参考:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 1.模板分为函数模板和类模板两种类型 函数模板针 ...
- 模板学习实践二 pointer
c++ template学习记录 使用模板将实际类型的指针进行封装 当变量退出作用域 自动delete // 1111.cpp : 定义控制台应用程序的入口点. // #include "s ...
- 算法模板学习专栏之总览(会慢慢陆续更新ing)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给 ...
随机推荐
- 一元回归1_基础(python代码实现)
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...
- spir 合并单元格
TableRow row = table2.AddRow(); var cell = row.AddCell(); var par = cell.AddParagraph(); par.Text = ...
- Unity ZTest 深度测试 & ZWrite 深度写入
初学Shader,一开始对于渲染队列,ZTest 和 ZWrite一头雾水,经过多方查阅和实验,有了一些自己的理解.发此文与初学Shader的朋友分享,也算是为自己做个笔记.不对或不足之处欢迎指正. ...
- c++读取utf-8格式中英文混合string
最近项目中用到需要给出每一个字在string中的索引,但是又因为中文字符跟英文字符长度不一样,得分开处理, 在这里记录一下. 想要达到的效果如下: 将 “测试3.1415engEng”分割开 代码: ...
- 【Bean】标签常用属性
[Bean]标签常用属性 Id 说明:起名称,id属性值名称任意,不能包含特殊符号,根据id得到配置对象. Class 说明:创建对象所在类的全路径. Name 说明:功能和id是一样的,id属性值不 ...
- laravel 添加后台登陆守护器
后台不能在一个浏览器登陆,下面简单配置下即可解决这个问题. 设置路由如下: <?php /** * 后台路由,从Illuminate\Routing\Router控制器的auth()方法中复制过 ...
- 使用ntpdate 同步 linux的时间
1. linux 查看时间和时区的命令 timedatectl 效果为: Local time: Sun -- :: CST Universal time: Sun -- :: UTC RTC tim ...
- 移动端HTML5开发问题汇总-样式篇
问题:Android 上圆形图片使用 border 时,边框显示变形 解决:给 img 外嵌套一个元素,为其使用圆角 <div> <img src=""> ...
- C#基础篇之C#和 .Net框架的概念和运行原理
一.微软平台的发展史 二..Net框架包含的东西 1.名词解释 BCL:基类库(Base Class Library)系统和底层提供的最基本的类库 CLR:公共语言运行时(Common Languag ...
- ajax异步加载分页评论带点赞功能
<script type="text/javascript" src="__ROOT__/Index/Tpl/Public/js/jquery.js"&g ...