Handlebars.js 模板引擎
介绍
Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板。它采用"Logic-less template"(无逻辑模版)的思路,在加载时被预编译,而不是到了客户端执行到代码时再去编译, 这样可以保证模板加载和运行的速度。Handlebars兼容Mustache,你可以在Handlebars中导入Mustache模板。
使用与安装
Handlebars的安装非常简单,你只需要从Github下载最新版本,你也可访问下面网址获取最新信息:http://handlebarsjs.com。
目前handlebars.js已经被许多项目广泛使用了,handlebars是一个纯JS库,因此你可以像使用其他JS脚本一样用script标签来包含handlebars.js
<script type="text/javascript" src=".js/handlebars.js"></script>
基本语法
Handlebars expressions 是handlebars模板中最基本的单元,使用方法是加两个花括号{{value}}
, handlebars模板会自动匹配相应的数值,对象甚至是函数。
例如:
<div class="demo">
<h1>{{name}}</h1>
<p>{{content}}</p>
</div>
你可以单独建立一个模板,ID(或者class)和type很重要,因为你要用他们来获取模板内容 例如:
<script id="tpl" type="text/x-handlebars-template">
<div class="demo">
<h1>{{title}}</h1>
<p>{{content.title}}</p>
</div>
</script>
handlebars会根据上下文来自动对表达式进行匹配,如果匹配项是个变量,则会输出变量的值,如果匹配项是个函数,则函数会被调用。
如果没找到匹配项,则没有输出。表达式也支持点操作符,因此你可以使用{{content.title}}
这样的形式来调用嵌套的值或者方法, handlebars会根据当前上下文输出content变量的title属性的值。
在JavaScript中,使用Handlebars.compile()
方法来预编译模板 例如:(这是一套规则)
//用jquery获取模板
var tpl = $("#tpl").html();
//原生方法
var source = document.getElementById('#tpl').innerHTML;
//预编译模板
var template = Handlebars.compile(source);
//模拟json数据
var context = { name: "zhaoshuai", content: "learn Handlebars"};
//匹配json内容
var html = template(context);
//输入模板
$(body).html(html);
Handlebar的表达式
Block表达式
有时候当你需要对某条表达式进行更深入的操作时,Blocks就派上用场了,在Handlebars中,你可以在表达式后面跟随一个#号来表示Blocks,然后通过{{/表达式}}
来结束Blocks。 如果当前的表达式是一个数组,则Handlebars会“自动展开数组”,并将Blocks的上下文设为数组中的元素。 例如:
<ul>
{{#programme}}
<li>{{language}}</li>
{{/programme}}
</ul>
有以下json数据
{
programme: [
{language: "JavaScript"},
{language: "HTML"},
{language: "CSS"}
]
}
编译模板代码同上…… 上面的代码会自动匹配programme
数据并展开数据,渲染DOM后就是这样的
<ul>
<li>JavaScript</li>
<li>HTML</li>
<li>CSS</li>
</ul>
Handlebars的内置块表达式(Block helper)
1.each block helper
你可以使用内置的{{#each}}
helper遍历列表块内容,用this
来引用遍历的元素 例如:
<ul>
{{#each name}}
<li>{{this}}</li>
{{/each}}
</ul>
对应适用的json数据
{
name: ["html","css","javascript"]
};
这里的this
指的是数组里的每一项元素,和上面的Block很像,但原理是不一样的这里的name是数组,而内置的each就是为了遍历数组用的,更复杂的数据也同样适用。
2.if else block helper
{{#if}}
就你使用JavaScript一样,你可以指定条件渲染DOM,如果它的参数返回false,undefined, null, "" 或者 [] (a "falsy" value)
, Handlebar将不会渲染DOM,如果存在{{#else}}
则执行{{#else}}
后面的渲染
例如:
{{#if list}}
<ul id="list">
{{#each list}}
<li>{{this}}</li>
{{/each}}
</ul>
{{else}}
<p>{{error}}</p>
{{/if}}
对应适用json数据
var data = {
info:['HTML5','CSS3',"WebGL"],
"error":"数据取出错误"
}
这里{{#if}}
判断是否存在list数组,如果存在则遍历list,如果不存在输出错误信息
3.unless block helper
{{#unless}}
这个语法是反向的if语法也就是当判断的值为false
时他会渲染DOM 例如:
{{#unless data}}
<ul id="list">
{{#each list}}
<li>{{this}}</li>
{{/each}}
</ul>
{{else}}
<p>{{error}}</p>
{{/unless}}
4.with block helper
{{#with}}
一般情况下,Handlebars模板会在编译的阶段的时候进行context传递和赋值。使用with的方法,我们可以将context转移到数据的一个section里面(如果你的数据包含section)。 这个方法在操作复杂的template时候非常有用。
<div class="entry">
<h1>{{title}}</h1>
{{#with author}}
<h2>By {{firstName}} {{lastName}}</h2>
{{/with}}
</div>
对应适用json数据
{
title: "My first post!",
author: {
firstName: "Charles",
lastName: "Jolley"
}
}
Handlebar的注释(comments)
Handlebars也可以使用注释写法如下
{{! handlebars comments }}
Handlebars的访问(Path)
Handlebar支持路径和mustache
,Handlebar还支持嵌套的路径,使得能够查找嵌套低于当前上下文的属性
可以通过.
来访问属性也可以使用../
,来访问父级属性。 例如:(使用.
访问的例子)
<h1>{{author.id}}</h1>
对应json数据
{
title: "My First Blog Post!",
author: {
id: 47,
name: "Yehuda Katz"
},
body: "My first post. Wheeeee!"
};
例如:(使用../
访问)
{{#with person}}
<h1>{{../company.name}}</h1>
{{/with}}
对应适用json数据
{
"person":
{ "name": "Alan" },
company:
{"name": "Rad, Inc." }
};
自定义helper
Handlebars,可以从任何上下文可以访问在一个模板,你可以使用Handlebars.registerHelper()
方法来注册一个helper。
调试技巧
把下面一段"debug helper"加载到你的JavaScript代码里,然后在模板文件里通过{{debug}}
或是{{debug someValue}}
方便调试数据
Handlebars.registerHelper("debug", function(optionalValue) {
console.log("Current Context");
console.log("====================");
console.log(this);
if (optionalValue) {
console.log("Value");
console.log("====================");
console.log(optionalValue);
}
});
handlebars的jquery插件
(function($) {
var compiled = {};
$.fn.handlebars = function(template, data) {
if (template instanceof jQuery) {
template = $(template).html();
}
compiled[template] = Handlebars.compile(template);
this.html(compiled[template](data));
};
})(jQuery);
$('#content').handlebars($('#template'), { name: "Alan" });
Handlebars.js 模板引擎的更多相关文章
- Handlebars的基本用法 Handlebars.js使用介绍 http://handlebarsjs.com/ Handlebars.js 模板引擎 javascript/jquery模板引擎——Handlebars初体验 handlebars.js 入门(1) 作为一名前端的你,必须掌握的模板引擎:Handlebars 前端数据模板handlebars与jquery整
Handlebars的基本用法 使用Handlebars,你可以轻松创建语义化模板,Mustache模板和Handlebars是兼容的,所以你可以将Mustache导入Handlebars以使用 Ha ...
- JS模板引擎handlebars.js的简单使用
handlebars.js的使用 首先我们要明白handlebars.js是干什么用的,我们知道使用jsp很麻烦, 于是我们开始使用freemarker等模板引擎,但这个只是针对服务器端来解 析的,那 ...
- doT js 模板引擎【初探】要优雅不要污
js中拼接html,总是感觉不够优雅,本着要优雅不要污,决定尝试js模板引擎. JavaScript 模板引擎 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注. ...
- 各种JS模板引擎对比数据(高性能JavaScript模板引擎)
最近做了JS模板引擎测试,拿各个JS模板引擎在不同浏览器上去运行同一程序,下面是模板引擎测试数据:通过测试artTemplate.juicer与doT引擎模板整体性能要有绝对优势: js模板引擎 Ja ...
- 调研js模板引擎
js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...
- js模板引擎介绍搜集
js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...
- js模板引擎--artTemplate
js模板引擎--artTemplate 以前研究过一段时间的handlebars,但因为其渲染性能略逊于腾讯的artTemplate(在artTemplate的GitHub官网上有推荐的性能测试地址) ...
- 浅析js模板引擎
js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...
- 使用新一代js模板引擎NornJ提升React.js开发体验
当前的前端世界中有很多著名的开源javascript模板引擎如Handlebars.Nunjucks.EJS等等,相信很多人对它们都并不陌生. js模板引擎的现状 通常来讲,这些js模板引擎项目都有一 ...
随机推荐
- bootstrap学习笔记之为导航条添加标题、二级菜单及状态 http://www.imooc.com/code/3120
为导航条添加标题.二级菜单及状态 加入导航条标题 在Web页面制作中,常常在菜单前面都会有一个标题(文字字号比其它文字稍大一些),其实在Bootstrap框架也为大家做了这方面考虑,其通过" ...
- windows搭建代理服务器
系统环境:windows server 2008R2 利用CCProxy软件达成 安装后确保设置正确,如下图: 注意:需要编辑防火墙开启相关端口,或直接关闭内网防火墙. 设置后可用telnet测试端口 ...
- javaWeb学习总结(8)- JSP原理
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
- c语言项目开发流程二部曲
一.在第一部曲中我们介绍了电子词典项目开发的前5步,下面继续我们的步伐. 6.函数接口设计,这一步不是一蹴而就的,在项目进行中得不断修改,下面是我电子词典项目接口. /**************函数 ...
- javascript获取json对象的key名称的两种方法
javascript获取json对象的key名称的两种方法 数据处理中,你可能接收到一个不确定内容格式的json对象,然后要把key的值提取出来.今天试过两种可以提取json key的方法,均可以正常 ...
- C语言之函数
函数:为了完成某一项功能而编写的代码的集合. C语言中的函数可以分为内置和自定函数. 内置函数:C语言中已经定义过的函数,不需要 声明,可以直接调用. 常见的内置函数: 函数名 类库 说明 doubl ...
- FreeMarker标签
目前最流行的两种模板技术恐怕要算freemarker和velocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选择使用freemarker或velocity ...
- Webpack插件开发简要
背景 如今'大前端'这个概念在前端界大热,说'大前端',我们就要提到'前后端分离','前后端分离'又离不开'本地开发构建','本地开发构建'自然离不开webpack,webpack想要工作,那它就需要 ...
- js扩展父类方法
在网上找了很多一直没找到关于JS扩展父类的方法,让我很是郁闷啊~要是真的开发组遇到了该咋整,于是乎自己手写了一些测试代码,没想到通过了……(难道是人品太好了?)废话不多说了直接上代码看看~ <s ...
- [项目记录]一个.net下使用HAP实现的吉大校园通知网爬虫工具:OAWebScraping
第一章 简介 本文主要介绍了在.NET下利用优秀的HTML解析组件HtmlAgilityPack开发的一个吉林大学校内通知oa.jlu.edu.cn的爬取器.尽管.Net下解析HTML文件有很多种选择 ...