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中插入变量(数据),是一个经常会被用到的基础功能,语法如下:

  1. {{ pageData }}

  不但如此,还可以访问并取到变量的子级变量,语法和js相同:

  1. {{ pageData.num }}
  2. {{ pageData['num'] }}

  然而,使用 {{}} 会对一些类似"<", ">"这样的字符串进行转义,显示出来就是"& lt;", "& gt;",所以如果需要引入原始数据(不被转义),就需要使用下面的语法:

  1. {{{ pageData }}}
  2. {{{ pageData.num }}}

  如果连大括号都要保留(不被转义或误识别)的话,那就需要这样写:

  1. {{%
  2. {{ pageData }}
  3. %}}

  如果想添加注释呢,只需要在双括号内加一个感叹号就行了:

  1. {{! 博主很帅(cai),大家知道就行了,不要声张}}

二、作用域

  每一个模板都有一个独立的作用域,在子模板中可以访问到父模板的上下文,但是在子模板中定义或者修改变量不会影响到父模板的变量。如下所示:

  parent.XTpl:

  1. {{ set (a = 1, b = 2) }}
  2. {{include ("sub.XTpl") }}
  3. in parent:
  4. a = {{ a }}
  5. b = {{ b }}

  sub.XTpl:

  1. in sub:
  2. {{ set b = 3 }}
  3. a = {{ a }}
  4. b = {{ b }}

  渲染 parent.XTpl,将会得到下面的结果:

  1. in sub:
  2. a: 1
  3. b: 3
  4. in parent:
  5. a: 1
  6. b: 2

三、方法

  在写模板的时候可以使用js自带的方法,比如数组的方法、字符串的方法都可以使用,这点非常方便。

  1. {{ set str = '我没有钱' }}
  2. {{ str.split('')[0] + str.split('')[2] + str.split('')[3] }} // => 我有钱

四、操作符

  XTemplate支持常见的操作符,比如:加(+),减(-),乘(*),除(/),余(%),还有比较类型的:=, !, >, >=, <, <=,以及逻辑操作方面的:或(||),与(&&),非(!)等等,甚至支持三元运算符:

  1. {{ a > b ? a : b }}

  然而需要注意的是:这里面不包含""号,如果需要使用等于,必须使用全等号(=),否则会报错。

五、函数调用

  如果你传递了 javascript 的方法到模板中,你可以像在 javascript 中一样使用它。比如使用预先定义并传进来的函数,将加载进模板的json数据转换为字符串,以供js文件从HTML中调取。

六、if 语句

  使用if语句可以对一个或多个条件进行判断,从而根据需求的不同而显示不同的代码块。

  1. {{# if (I'm rich) }}
  2. Show me my money.
  3. {{/ if }}

  或者你还可以加入 elseif 语句

  1. {{# if (I am handsome) }}
  2. I am handsome.
  3. {{ elseif (I am owesome) }}
  4. I am not only handsome but also owesome.
  5. {{ else }}
  6. Sorry, but there is no else.
  7. {{/ if }}

七、each 语句

  使用each语句可以对数据和HTML结构进行循环,非常方便的将数据按照顺序写入到HTML结构中:

  1. {{set (array = [{
  2. name: "one"
  3. }, {
  4. name: "two"
  5. }])}}
  6. {{#each(array)}}
  7. {{'第' + (xindex + 1) + '行:' + this.name}}
  8. {{/each}}

  渲染这个模版,将会得到结果:

  1. 1行:one
  2. 2行:two

八、include 语句

  include语句用于引入其他模板:

  1. {{ include ("item.xtpl") }}

  不但如此,在引入模板时还可以传递并修改参数:

  1. {{ set (x = "x", y = "y") }}
  2. {{ include ("sub.xtpl", a = x, b = x)}}

  渲染 parent.html 将会得到结果:

  1. x: x
  2. y: y
  3. a: x
  4. b: x

九、模板继承

  模板继承可以使用户非常容易地复用模板。比如可以写一个基础模板,里面写入一些公用的内容,并且在里面定义一些block,比如header/body/footer之类,然后子模板只需要将这些block重写即可。如下:

  先定义一个base.xtpl:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta name="charset" content="utf-8" />
  5. <title>{{title}}</title>
  6. {{{block ("head")}}}
  7. </head>
  8. <body>
  9. {{{block ("body")}}}
  10. </body>
  11. </html>

  再编写content.xtpl:

  1. {{extend ("./parent")}}
  2. {{#block ("head")}}
  3. <link type="text/css" href="test.css" rev="stylesheet" rel="stylesheet"/>
  4. {{/block}}
  5. {{#block ("body")}}
  6. <h2>{{title}}</h2>
  7. {{/block}}

  然后我们使用数据 {title: 'XTemplate'} 渲染 content.xtpl,将会得到下面的结果:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta name="charset" content="utf-8" />
  5. <title>XTemplate</title>
  6. <link type="text/css" href="test.css" rev="stylesheet" rel="stylesheet"/>
  7. </head>
  8. <body>
  9. <h2>XTemplate</h2>
  10. </body>
  11. </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. Promise【其他模式】

    Promise @Slf4j public class Promise { /** * Promise Pattern[承诺]:承诺表示当前还未完成,但是会在将来完成的操作,用于实现异步计算. */ ...

  2. 阶段3 1.Mybatis_11.Mybatis的缓存_3 mybatis一对一实现延迟加载

    不用骨架创建项目 复制一对多的代码src下的代码到我们刚才创建的项目里面 把依赖信息复制过来 这里原来实现的功能是立即加载的功能.sql语句是一次性查询的两个表关联的查询. 调整代码 删除Accoun ...

  3. MySQL5.6版本之后设置DATETIME类型自动更新

    在使用MySQL中datetime格式自动更新特性时,我们应该明确一点,datetime格式设置默认值为当前时间和自动更新时间是从MySQL5.6版本之后开始支持的.此前我们都是使用timestamp ...

  4. 如何通过shell脚本或一行命令更改root密码?

    哪个能用就用哪个吧! 方法一, echo -e "newpwd\nnewpwd" | (passwd root) 方法二, echo "newpwd" | pa ...

  5. C 语言中的关键字 - 数据类型、数据修饰符及逻辑结构

    C 语言中有 32 个关键字.这是留个编译器用的特殊字符串,用户不可以使用. 特殊关键字 sizeof 和 return 是 C 语言中的两个特殊关键字. sizeof sizeof 用于计算变量所占 ...

  6. cocos2dx基础篇(21) 进度条CCProgressTimer

    [3.x] (1)去掉 "CC" (2)CCProgressTimerType 改为强枚举 ProgressTimer::Type:: // RADIAL //扇形进度计时器 BA ...

  7. 关于Unity3D中的SerialField这个Attribute的功能

    首先我们看看效果,以下是源文件的内容: 然后对应的面板: 要注意的地方其实就这里: 可以看出,public默认就可以在面板中进行修改,相应的设为private的isCreateSoldier却不会出现 ...

  8. 第十届山东省acm省赛补题(2)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4124 L Median Time Limit: 1 Second      ...

  9. LAMP框架

    一基本常识 LNMP (Linux + Nginx + MySQL + PHP) LAMP (Linux + Apache + MySQL + PHP) //php作为Apache的模块Apache. ...

  10. vue分别打包测试环境和正式环境

    vue打包时使用不同的环境变量 需求 同一个项目通过打包使用不同的环境变量,目前的环境有三个: 一.本地------开发环境 二.线上------测试环境 三.线上------正式环境 我们都知道vu ...