# Javascript 模板引擎
由于现在大部分业务需要组装大量的html填充网页,所以封装了超级模板引擎方法`Wechat.T`;不用关心他的性能,几百万数据都是小意思了.现在此api在本地不能使用,线上使用了` <wx:config wechat="Duogu" api="onMenuShareTimeline,onMenuShareAppMessage" />`会自动部署此方法,本地测试的时候需要手动引用:
`http://wx.diggid.cn/static/scripts/wechat.min.js?812f611e`;
> demo地址
[投票小应用1](http://wx.diggid.cn/Wap1/Test/ticket),[下载代码](http://wx.diggid.cn/static/download/ticket.zip)
[投票小应用2](http://wx.diggid.cn/Wap1/Test/repeat),[下载代码](http://wx.diggid.cn/static/download/repeat.zip)
**API:** `Wechat.T(template).render(data,[callback|string])`
## 模版语法
* 输出一个普通字段,不转义html: {{ d.field }}
* 输出一个普通字段,并转义html: {{= d.field }}
* 运行一段js脚本: {{# ... }} 如{{# for(var i = 0; i< 10 ; i++){alert(i)} }};
## 方法
`var tpl = Wechat.T(template)`是获取一个字符串组成的模板,这个模板有个render方法,调用render可以填充渲染任意的指定的数据
## 使用说明
1.准备数据
假设现在需要开发一款简单的投票应用,提供了以下`json`数据,每次投票我们需要录入以下数据,我们希望能拼装成页面,传统方法是使用`for`循环,用+号连接这些数据
```json
var active = {
title:'第12届前端投票',
desc:'第12届前端开发大会投票评选活动',
user:[
{name:'金金金',age:22,desc:'测试数据A',ticket:20},
{name:'张三',age:18,desc:'测试数据B',ticket:20},
{name:'王三',age:29,desc:'测试数据C',ticket:20},
{name:'刘小泉',age:42,desc:'测试数据D',ticket:20}
]
}
```
2.准备页面
现在开始根据设计稿简单的切图,假设这个投票应用就是以下这样的:(我用bootstrap随便写的)
![示例图](https://box.kancloud.cn/2016-01-07_568e21a5cb781.png)
代码
```html
<body>
<div class="container" id="app">
<div class="alert alert-success">xxx届投票大赛</div>
<ul class="list-group">
<li class="list-group-item"> 小刘 (xxx)
<button class="pull-left btn btn-xs btn-primary">给他投票</button> <span class="badge">22票</span>
</li>
<li class="list-group-item"> 小刘 (xxx)
<button class="pull-left btn btn-xs btn-primary">给他投票</button> <span class="badge">22票</span>
</li>
<li class="list-group-item"> 小刘 (xxx)
<button class="pull-left btn btn-xs btn-primary">给他投票</button> <span class="badge">22票</span>
</li>
</ul>
</div>
</body>
```
3.其实上面的`#app`就是我们以后类似页面需要的模板了,所以我们下面的`script`放模板,这时候我们可以把上面 #app里面的所有内容都删除了,现在假设上面的所有数据都在一个变量`d`中,且这个`d`在模板内是一个变量,只需要使用两个双括号就可以应用了,`{{d.title}}`就是上面的`active.title`,所有的js变量都用{{}}包起来,js语句使用{{# ...}},修改模板成这个样子
```html
<script type="text/html" id="template">
<div class="alert alert-success">{{ d.title }}</div>
<ul class="list-group">
{{# for(var i = 0; i < d.user.length ; i++ ){ }}
<li class="list-group-item"> {{d.user[i].name}} ({{d.user[i].desc}})
<button onclick="alert('给{{ d.user[i].name }}投票')" class="pull-left btn btn-xs btn-primary">给他投票</button>
<span class="badge">{{d.user[i].ticket}}票</span>
</li>
{{# } }}
</ul>
</script>
```
4.使用数据填充模板,搞定
```javascript
Wechat.T( document.getElementById('template').innerHTML ).render(active,'#app');
```
全部代码
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分享测试</title>
<wx:config wechat="Duogu" api="onMenuShareTimeline,onMenuShareAppMessage" />
<wx:csscdn name="bootstrap" />
<wx:jscdn name="jquery" />
</head>
<body>
<div class="container" id="app"></div>
</body>
<script type="text/html" id="template">
<div class="alert alert-success">{{ d.title }} (<small>{{ d.desc }}</small>)</div>
<ul class="list-group">
{{# for(var i = 0; i < d.user.length ; i++ ){ }}
<li class="list-group-item"> {{d.user[i].name}} ({{d.user[i].desc}})
<button onclick="alert('给{{ d.user[i].name }}投票')" class="pull-left btn btn-xs btn-primary">给他投票</button>
<span class="badge">{{d.user[i].ticket}}票</span>
</li>
{{# } }}
</ul>
</script>
<script>
var active = {
title:'第12届前端投票',
desc:'第12届前端开发大会投票评选活动',
user:[
{name:'金金金',age:22,desc:'测试数据A',ticket:20},
{name:'张三',age:18,desc:'测试数据B',ticket:19},
{name:'王三',age:29,desc:'测试数据C',ticket:27},
{name:'刘小泉',age:42,desc:'测试数据D',ticket:13}
]
};
Wechat.T( document.getElementById('template').innerHTML ).render(active,'#app');
</script>
</html>
```
- 前端篇
- 常用知识点
- 表单处理
- 前后端分离
- 提供模板渲染工具
- 页面优化
- css3动画部分
- 前端工程与模块化框架
- 服务器XML标签用法
- 微信JSSDK
- 小技巧
- 纯CSS实现自适应正方形
- 通用媒体查询
- css 黑科技
- H5性能优化方案
- 10个最常见的 HTML5
- 常见坑
- 资源收集
- 前端组件化开发实践
- 应用秒开计划
- AJAX API部分
- 静态资源处理优化
- 后端篇
- 微信对接与管理
- 微信消息处理
- API插件开发
- Plugin开发
- 后端插件开发
- 组件开发
- XML标签开发
- RESTFUL设计
- Admin GUI
- 设计篇
- 设计规范
- 微信开发库v.js
- 使用方法
- 微信JSSDK集成
- 调试面板使用
- 插件-http功能
- 插件-layer弹出层
- 插件-music 音乐播放器
- 插件-store 本地存储
- 插件 emitter 事件管理器
- 插件-shake 摇动功能
- 插件-lazyload 延迟加载
- 插件-t 模板渲染
- 插件-ani 动画功能
- 插件-is 类型侦测器
- 插件-ease 缓动函数库
- 插件-os 设备检测
- 插件 $ 类Jquery插件
- 插件-md5 散列计算
- 插件-svg动画loading
- 后台页面成功GUI
- 列表渲染List
- 表单生成Config
- 树状列表Tree
- 排序操作Sort
- Js 风格指南
- Vuep
- 内置动画库
- 组件库
- 内置插件库
- PSD自动切图