XTemplate模板学习和使用总结

前言

  XTemplate是我接触的第一个模板语言,用在公司的一个NodeJS项目中,跟它打交道经常是因为需要使用它的语法向模板中注入数据。因为是刚入门前端不久,所以一开始对这个语言有些抵触(毕竟不会用,还要上手写业务...),“这种我明明可以写在js文件里啊,为啥非要写在模板里??”之类。但是在了解并使用它写了一些业务之后就发现,模板语言是真的好用。

XTemplate的好处

  1. 首先,使用XTemplate可以很方便地使用include语法调用不同的模板。你可以将一个复杂的页面拆成几个不同的模块来写,其中很可能一些模块是可复用的,这样将来再需要这些模块时只要简单的将其include进来就好,而不必每次都重新写一遍。在浏览代码时也会显得很直观;
  2. 这种可拆分的特性不仅仅只是直观而已,其可维护性和可扩展性都大大提高了。业务需求变更时,只需更改涉及到的功能模块,然后所有调用这个模块的页面都会同步修改。想要增加功能时亦是如此;
  3. 也是因为可拆分的特性,一个项目可以方便的分由几个团队成员共同完成,每个人都可以专注于开发自己的模块,避免不必要的代码冲突,这使得开发效率大大提高;
  4. 就数据的导入来讲,在模板阶段导入数据和采用js文件异步方式导入数据优势各有不同。js异步加载一般是在页面在用户浏览器端加载完成时进行,也就是说页面“到达”浏览器端时是没有数据的。但这个特点并不影响js异步加载作为页面交互的主要手段。模板加载的方式就不同了,页面在“到达”用户浏览器之前就已经是加载好了的,用户不必再通过js向服务器发送请求,以加载页面的基础数据,只需要在需要交互的时候再发送请求即可,体验更加无缝;
  5. XTemplate对编写HTML也是非常友好的。具体在于XTemplate提供了不少非常实用的语法功能,正是在了解和使用这些功能的过程中,我逐渐改变了想法(留下了不学无术的泪水.jpg);
  6. 由于没有接触过其他模板引擎,所以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模板学习和使用总结的更多相关文章

  1. sencha Touch 2.4 学习之 XTemplate模板

    XTemplate模板 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  2. 39.VUE学习--组件,子组件中data数据的使用,x-template模板的使用,改变for循环里的某条数据里的值

    多处引用相同组件时,操作data不会相互影响 <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...

  3. ExtJs4 笔记(4) Ext.XTemplate 模板

    ExtJs4 笔记(4) Ext.XTemplate 模板 摘自:http://www.cnblogs.com/lipan/ 本篇将涉及到ExtJs中一个重要的概念,模板.话说Razor很神奇,但是我 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. C++模板学习

    一.定义函数模板 template<class T> 函数定义 举个例子比较两个数大小: template<class T> int Compare(T a,T b) { ; ...

  6. [转载]ExtJs4 笔记(4) Ext.XTemplate 模板

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  7. C++模板学习随笔

    本文学习内容参考:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 1.模板分为函数模板和类模板两种类型 函数模板针 ...

  8. 模板学习实践二 pointer

    c++ template学习记录 使用模板将实际类型的指针进行封装 当变量退出作用域 自动delete // 1111.cpp : 定义控制台应用程序的入口点. // #include "s ...

  9. 算法模板学习专栏之总览(会慢慢陆续更新ing)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给 ...

随机推荐

  1. 一元回归1_基础(python代码实现)

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...

  2. spir 合并单元格

    TableRow row = table2.AddRow(); var cell = row.AddCell(); var par = cell.AddParagraph(); par.Text = ...

  3. Unity ZTest 深度测试 & ZWrite 深度写入

    初学Shader,一开始对于渲染队列,ZTest 和 ZWrite一头雾水,经过多方查阅和实验,有了一些自己的理解.发此文与初学Shader的朋友分享,也算是为自己做个笔记.不对或不足之处欢迎指正. ...

  4. c++读取utf-8格式中英文混合string

    最近项目中用到需要给出每一个字在string中的索引,但是又因为中文字符跟英文字符长度不一样,得分开处理, 在这里记录一下. 想要达到的效果如下: 将 “测试3.1415engEng”分割开 代码: ...

  5. 【Bean】标签常用属性

    [Bean]标签常用属性 Id 说明:起名称,id属性值名称任意,不能包含特殊符号,根据id得到配置对象. Class 说明:创建对象所在类的全路径. Name 说明:功能和id是一样的,id属性值不 ...

  6. laravel 添加后台登陆守护器

    后台不能在一个浏览器登陆,下面简单配置下即可解决这个问题. 设置路由如下: <?php /** * 后台路由,从Illuminate\Routing\Router控制器的auth()方法中复制过 ...

  7. 使用ntpdate 同步 linux的时间

    1. linux 查看时间和时区的命令 timedatectl 效果为: Local time: Sun -- :: CST Universal time: Sun -- :: UTC RTC tim ...

  8. 移动端HTML5开发问题汇总-样式篇

    问题:Android 上圆形图片使用 border 时,边框显示变形 解决:给 img 外嵌套一个元素,为其使用圆角 <div> <img src=""> ...

  9. C#基础篇之C#和 .Net框架的概念和运行原理

    一.微软平台的发展史 二..Net框架包含的东西 1.名词解释 BCL:基类库(Base Class Library)系统和底层提供的最基本的类库 CLR:公共语言运行时(Common Languag ...

  10. ajax异步加载分页评论带点赞功能

    <script type="text/javascript" src="__ROOT__/Index/Tpl/Public/js/jquery.js"&g ...