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. 开发-日常工具:TFS(Team Foundation Server)

    ylbtech-开发-日常工具:TFS(Team Foundation Server) TFS(Team Foundation Server)是一个高可扩展.高可用.高性能.面向互联网服务的分布式文件 ...

  2. spotlight监控mysql性能

    spotlight可以监控mysql性能,同监控linux一样配置 目录 1.安装spotlight 2.参数认识 1.安装spotlight spotlight不仅仅只是监控mysql,还可以完成数 ...

  3. C#正则的使用

    c#使用正则表达式要用到System.Text.RegularExprssions命名空间 官方API Regex类是用于匹配表达式: 通常Regex分为静态类和实例化俩种方式.那这俩种有什么区别呢, ...

  4. eclipse code recommenders cannot download its model repository index

    Cent OS 7 运行 eclipse oxygen 代码提示出现标题所示的错误,解决办法,将网络提供程序设置为手动即可解决. Window->Preference->General-& ...

  5. if you wanna the rainbow, you have to deal with the rain.

    bulk. n. 大量 reluctant. adj. 不情愿的 terrorist. n. 恐怖分子 recognition. n. 认出 tout.v. 兜售 conceal.v. 隐藏 dras ...

  6. 1.parrot os 3.5-----nmap-----katoolin--zenmap

    源:https://www.youtube.com/watch?v=LpM1KooILRc&list=PLBf0hzazHTGOEuhPQSnq-Ej8jRyXxfYvl&index= ...

  7. python 并发编程 多进程 JoinableQueue

    JoinableQueue和Queue 使用一样 这就像是一个Queue对象,但队列允许项目的使用者通知生成者项目已经被成功处理.通知进程是使用共享的信号和条件变量来实现的. JoinableQueu ...

  8. Python 入门之格式化输出

    Python 入门之格式化输出 1.格式化 (1)%为占位 (2)%s --- 站字符串的位置(数字.字符串都能够进行填充) name = input('请输入姓名:') age = input('请 ...

  9. Could not locate executable null\bin\winutils.exe in the Hadoop binaries解决方式

    1.  问题: 2.  问题解决: 仔细查看报错是缺少winutils.exe程序. Hadoop都是运行在Linux系统下的,在windows下eclipse中运行mapreduce程序,要首先安装 ...

  10. mac chromedriver error

    问题一:MAC 使用splinter error Traceback (most recent call last): from splinter.browser import Browser b = ...