来源:http://idangero.us/template7/#.V2iXqJGF6Ul

测试用json数据:

var jsonData = {
people: [
{
firstName: 'John',
lastName: 'Doe'
},
{
firstName: 'Mark',
lastName: 'Johnson'
},
],
title: "this is a test title",
preKey: "full name"
};

template7支持下面的语法:

变量:

{{title}}:输出当前上下文对象下的title字段

{{../title}}:输出当前上下文对象的父级对象下的title字段

{{../../title}}:输出当前上下文对象向上推两级的对象下的title字段

{{this}}:当前上下文对象

{{person.name}}:输出在当前上下文中的“人”变量的“名称”属性

{{../person.name}}:输出在当前上下文的 父级对象 中的“人”变量的“名称”属性

块表达式:

{{#each}} :循环开始

{{else}}:当数组无数据的时候执行

{{/each}}:结束循环

{{if}}:条件判断

{{else}}:不满足条件判断执行块

{{/if}}:结束

{{#each reverse="true"}} - begin of block expression with passed reverse:true hash arguments,暂没用过,也没翻译

编辑和渲染:

template7是全球可用的窗口函数。
首先,我们需要提供字符串模板。例如,我们可以存储在脚本标签中。

下面一个例子:每一步注释都写的很清楚了。

@*引入js*@
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/Template7-1.1.0/src/template7.js"></script>
<script>
$(function () {
//测试用json数据
var jsonData = {
people: [
{
firstName: 'John',
lastName: 'Doe'
},
{
firstName: 'Mark',
lastName: 'Johnson'
},
],
title: "this is a test title",
preKey: "full name"
}; //获取模板
var template = $('#template').html(); // 编译模板
var compiledTemplate = Template7.compile(template); // 使用模板加载数据
var htmlStr = compiledTemplate(jsonData); //将得到的结果输出到指定区域
$("#contents").html(htmlStr);
}); </script>
@*模板的 type指定为 text/template7 *@
<script type="text/template7" id="template">
<p>{{title}}</p>
<ul>
{{#each people}}
<li>{{../preKey}}:{{firstName}} {{lastName}}</li>
{{/each}}
</ul>
</script> <div id="contents"></div>

 内置函数:

{{join myArray delimiter=", "}}:把数组 myArray 的每个元素使用逗号“,”拼接到一起。只为数组

{{@index}}:在循环中,获得序号,从0开始。只为数组

@first:循环中的第一个项。只为数组

@last:循环中的最后一个项。只为数组

@key:当前对象属性的名称。只为对象

Template 模板 Context 数据 Output 输出
Iterate through Array items 遍历数组项
<p>Here are the list of people i know:</p>
<ul>
{{#each people}}
<li>{{firstName}} {{lastName}}</li>
{{/each}}
</ul>
{
people : [
{
firstName: 'John',
lastName: 'Doe'
},
{
firstName: 'Mark',
lastName: 'Johnson'
},
]
}
<p>Here are the list of people i know:</p>
<ul>
<li>John Doe</li>
<li>Mark Johnson</li>
</ul>
<p>Here are the list of people i know:</p>
<ul>
{{#each people}}
<li>{{@index}}. {{this}}</li>
{{/each}}
</ul>
{
people : ['John Doe', 'Mark Johnson']
}
<p>Here are the list of people i know:</p>
<ul>
<li>0. John Doe</li>
<li>1. Mark Johnson</li>
</ul>
Iterate through Object properties
<p>Car properties:</p>
<ul>
{{#each props}}
<li>{{@key}}: {{this}}</li>
{{/each}}
</ul>
{
props: {
power: '150 hp',
speed: '200 km/h',
}
}
<p>Car properties:</p>
<ul>
<li>power: 150 hp</li>
<li>speed: 200 kn/h</li>
</ul>
{{else}} expression.
<p>Car properties:</p>
<ul>
{{#each props}}
<li>{{@key}}: {{this}}</li>
{{else}}
<li>No properties</li>
{{/each}}
</ul>
{
props: {
power: '150 hp',
speed: '200 km/h',
}
}
<p>Car properties:</p>
<ul>
<li>power: 150 hp</li>
<li>speed: 200 kn/h</li>
</ul>
<p>Car properties:</p>
<ul>
{{#each props}}
<li>{{@key}}: {{this}}</li>
{{else}}
<li>No properties</li>
{{/each}}
</ul>
{}
<p>Car properties:</p>
<ul>
<li>No properties</li>
</ul>

{#if}}...{{else}}...{{/if}}

Template 模板 Context 数据 Output 输出
<a href="#" {{#if active}}class="active"{{/if}}>{{title}}</a>
{
active: true,
title: 'Link',
}
<a href="#" class="active">Link</a>
{{else}} expression.
<p>Hello, my name is {{name}}.</p>
{{#if hobby}}
<p>I have hobby</p>
{{else}}
<p>I don't have hobby</p>
{{/if}}
{
name: 'John Doe',
hobby: false
}
<p>Hello, my name is John Doe.</p>
<p>I don't have hobby</p>

{{#unless}}...{{else}}...{{/unless}}

Template -> Context -> Output
<a href="#" {{#unless active}}class="active"{{/unless}}>{{title}}</a>
{
active: true,
title: 'Link',
}
<a href="#">Link</a>
{{else}} expression.
<p>Hello, my name is {{name}}.</p>
{{#unless hobby}}
<p>I have hobby</p>
{{else}}
<p>I don't have hobby</p>
{{/unless}}
{
name: 'John Doe',
hobby: false
}
<p>Hello, my name is John Doe.</p>
<p>I have hobby</p>

{{#with}}...{{/with}}

Template -> Context -> Output
{{#with props}}
<p>Car has {{power}} power and {{speed}} maximum speed</p>
{{/with}}
{
props: {
power: '150 hp',
speed: '200 km/h',
}
}
<p>Car has 150 hp power and 200 km/h maximum speed</p>

{{#variableName}}...{{/variableName}}

Template -> Context -> Output
<ul>
{{#people}}
<li>{{name}} - {{age}} years old</li>
{{/people}}
</ul>
{
people: [
{
name: 'John Doe',
age: 18
},
{
name: 'Mark Johnson',
age: 21
}
]
}
<ul>
<li>John Doe - 18 years old</li>
<li>Mark Johnson - 21 years old</li>
</ul>
{{#props}}
<p>Car has {{power}} power and {{speed}} maximum speed</p>
{{/props}}
{
props: {
power: '150 hp',
speed: '200 km/h',
}
}
<p>Car has 150 hp power and 200 km/h maximum speed</p>

{{join delimiter=""}}

Template -> Context -> Output
<h3>"{{title}}" TV Show</h3>
<p>Was released in year {{year}}</p>
<p>Genres: {{join genres delimiter=", "}}</p>
{
title: 'Friends',
year: 2001,
genres: ['comedy', 'drama']
}
<h3>"Friends" TV Show</h3>
<p>Was released in year 2001</p>
<p>Genres: comedy, drama</p>

{{escape}}

Template -> Context -> Output
<h1>{{title}}</h1>
<p>{{escape body}}</p>
{
title: 'Paragraphs',
body: 'We need to use <p> tags to add paragraphs in HTML',
}
<h1>Paragraphs</h1>
<p>We need to use &lt;p&gt; tags to add paragraphs in HTML</p>

{{js "expression"}}

Template -> Context -> Output
<h3>{{title}}</h3>
<p>Price: ${{js "this.price * 1.2"}} </p>
<p>{{js "this.inStock ? 'In Stock' : 'Not in stock'"}} </p>
{
title: 'iPhone 6 Plus',
price: 1000,
inStock: true
}
<h3>iPhone 6 Plus</h3>
<p>Price: $1200</p>
<p>In stock</p>

{{#js_compare "expression"}}...{{/js_compare}}

Template -> Context -> Output
<h3>{{title}}</h3>
<p>Price: ${{price}} </p>
<p>{{#js_compare "color === 'white' && memory > 16"}}Not in stock{{else}}In stock{{/js_compare}} </p>
{
title: 'iPhone 6 Plus',
price: 1000,
color: 'white',
memory: 32
}
<h3>iPhone 6 Plus</h3>
<p>Price: $1000</p>
<p>Not in stock</p>
<p>{{#js_compare "a === b"}}A equals to B{{else}}A not equal to B{{/js_compare}} </p>
{
a: 5,
b: 34
}
<p>A not equal to B</p>

Using Custom Helpers,自定义函数

语法:

Template7.registerHelper(name, helper)

  • name - string - helper name
  • helper - function - helper function to handle passed context

Demo:

Template7.registerHelper('link', function (url, title, options){
var ret = '<li>' +
'<a href="' + url + '" class="item-content item-link" target="' + options.hash.target + '">' +
'<div class="item-inner">' +
'<div class="item-title">' + title + '</div>' +
'</div>' +
'</a>' +
'</li>';
return ret;
});

  

Template -> Context -> Output
<div class="list-block">
<ul>
{{#each links}}
{{link url title target="_blank"}}
{{/each}}
</ul>
</div>
{
links: [
{
url: 'http://google.com',
title: 'Google'
},
{
url: 'http://idangero.us',
title: 'iDangero.us'
},
]
}
<div class="list-block">
<ul>
<li>
<a href="http://google.com" target="_blank" class="item-link item-content">
<div class="item-inner">
<div class="item-title">Google</div>
</div>
</a>
</li>
<li>
<a href="http://idangero.us" target="_blank" class="item-link item-content">
<div class="item-inner">
<div class="item-title">iDangero.us</div>
</div>
</a>
</li>
</ul>
</div>

注:自定义函数应在编译模板之前注册。

移除自定义函数:

Template7.unregisterHelper(name)

name - string - 函数名称

全局变量:

Template7.global = { os: 'iOS', browser: 'Chrome', username: 'johndoe', email: 'john@doe.com' };

使用:<p>Hello, {{@global.username}}. Your email is {{@global.email}}</p>

访问数据根节点:

有时候我们在循环的时候需要用到根节点的数据,可以使用{{@root}}来达到目的:

{
persons: [
{
name: 'John',
hobby: ['Cars', 'Food']
},
{
name: 'Kyle',
hobby: ['Travel', 'Puzzles']
}, ],
showHobby: true
} {{#each persons}}
<h2>{{name}}</h2>
<h3>Hobby:</h3>
{{#if @root.showHobby}}
<ul>
{{#each hobby}}
<li>{{this}}</li>
{{/each}}
</ul>
{{/if}}
{{/each}}

  

部分模板:

创建:Template7.registerPartial(name, template) - register partial

name - string - partial name 模板名称
helper - string - partial template 模板内容

移除:Template7.unregisterPartial(name) - unregister partial

name - string - partial name 模板名称

调用方法:{{> "partialName"}}

原模板:

<ul class="users">
{{#each users}}
{{> "user"}}
{{/each}}
</ul>
<ul class="admins">
{{#each admins}}
{{> "user"}}
{{/each}}
</ul>

注册部分模板:

Template7.registerPartial('user', '<li><h2>{{firstName}} {{lastName}}</h2><p>{{bio}}</p></li>');

应用模板数据:

{
users: [
{
firstName: 'John',
lastName: 'Doe',
bio: 'Lorem ipsum dolor'
},
{
firstName: 'Jane',
lastName: 'Doe',
bio: 'Donec sodales euismod augue'
}
],
admins: [
{
firstName: 'Mike',
lastName: 'Doe',
bio: 'Lorem ipsum dolor'
},
{
firstName: 'Kate',
lastName: 'Doe',
bio: 'Donec sodales euismod augue'
}
]
}

输出结果:

<ul class="users">
<li>
<h2>John Doe</h2>
<p>Lorem ipsum dolor</p>
</li>
<li>
<h2>Jane Doe</h2>
<p>Donec sodales euismod augue</p>
</li>
</ul>
<ul class="admins">
<li>
<h2>Mike Doe</h2>
<p>Lorem ipsum dolor</p>
</li>
<li>
<h2>Kate Doe</h2>
<p>Donec sodales euismod augue</p>
</li>
</ul>

  

递归使用部分模板:

我们甚至可以递归使用部分模板,如嵌套的注释:

// Simple template with just a partial
var template = '{{> "comments"}}' // Register partial
Template7.registerPartial(
'comments',
'<ul>' +
'{{#each comments}}' +
'<li>' +
'<h2>{{author}}</h2>' +
'<p>{{text}}</p>' +
'{{#if comments}}{{> "comments"}}{{/if}}' +
'</li>' +
'{{/each}}' +
'</ul>'
); // Compile template
var compiledTemplate = Template7.compile(template); // Render template
var output = compiledTemplate({
comments: [
{
author: 'John Doe',
text: 'Lorem ipsum dolor',
comments: [
{
author: 'Mike Doe',
text: 'Aliquam erat volutpat'
},
{
author: 'Kate Doe',
text: 'Donec eget fringilla turpis'
}
]
},
{
author: 'Jane Doe',
text: 'Donec sodales euismod augue'
}
]
})

  

输出结果:

<ul class="comments">
<li>
<h2>John Doe</h2>
<p>Lorem ipsum dolor</p>
<ul class="comments">
<li>
<h2>Mike Doe</h2>
<p>Aliquam erat volutpat</p>
</li>
<li>
<h2>Kate Doe</h2>
<p>Donec eget fringilla turpis</p>
</li>
</ul>
</li>
<li>
<h2>Jane Doe</h2>
<p>Donec sodales euismod augue</p>
</li>
</ul>

Template7学习记录的更多相关文章

  1. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  2. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  3. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  4. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  5. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  6. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

  7. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  8. UWP学习记录8-设计和UI之控件和模式5

    UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...

  9. UWP学习记录7-设计和UI之控件和模式4

    UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...

随机推荐

  1. 阿里历年经典Java面试题汇总

    Volatile的特征: A.禁止指令重排(有例外) B.可见性 Volatile的内存语义: 当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存. 当读一个vol ...

  2. pidgin-lwqq

    今天第一次用pidgin登上了qq,好神奇. 从网上看到的,说是pidgin发布了支持webqq协议的lwqq,按照解释之后安装了. 感觉好神奇啊. 一个绿色的小企鹅^^ 今天有看到了一个大牛,我觉得 ...

  3. 为什么要使用索引?-Innodb与Myisam引擎的区别与应用场景

    Innodb与Myisam引擎的区别与应用场景 http://www.cnblogs.com/changna1314/p/6878900.html https://www.cnblogs.com/ho ...

  4. mybatis异常:Could not find result map Java.util.Map 问题分析及解决 定位不到具体的位置的错误

    mybatis异常:Could not find result map Java.util.Map 问题分析及解决 报这个错误呢,很难受的就是你定位不到具体的地方,找不到位置修改,你只知道有错误,但是 ...

  5. python静态方法类方法属性方法

    Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问 ...

  6. php解析HTML

    PHP Simple HTML DOM 解析器显然是相当不多的html文件解析工具.他能够在server端採用相似于jquery的方式进行dom查找和改动.眼下这个解析器支持PHP5. 可是,这个首先 ...

  7. laravel中生成支付宝 二维码 扫码支付

    文档教程模拟: http://www.023xs.cn/Article/37/laravel5%E9%9B%86%E6%88%90%E6%94%AF%E4%BB%98%E5%AE%9Dalipay%E ...

  8. java web Servlet开发(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  9. erlang otp中的socket参数设置

    抄自http://www.zackzod.me/2012/10/24/socket-options-in-erlang-otp.html Erlang的inet模块里提供了对Socket进行一系列参数 ...

  10. java 面向对象 — 继承

    继承中的构造方法,先执行父类中的构造方法,然后执行子类中的构造方法 继承中的属性,最后执行的属性 覆盖前面的属性 因为是开辟了 两个内存空间,所以相比较是不同的. 如果想比较两个对象的值是否相同的话, ...