前言
Web應用開發正在處於一個快速發展的時期,隨着HTML5規範的落實和普及,相信會有越來越多的優秀的web應用呈現出來。JavaScript是web應用開發中是非常重要的語言,該語言有很多流行的庫供大家使用。本期給大家介紹語義模板庫Handlebars的使用方法。
本文示例代碼已經全部上傳GitHub:https://github.com/DaweiCheng/handlebarstutor 也歡迎大家積極貢獻更多示例代碼。
目錄
1. Handlebars介紹
2. 安裝和使用
3. 使用expressions
4. 使用helpers
5. partials
1. Handlebars介紹
Handlebars是JavaScript一個語義模板庫,通過對view和data的分離來快速構建Web模板。它採用"Logic-less template"(無邏輯模版)的思路,在加載時被預編譯,而不是到了客戶端執行到代碼時再去編譯,這樣可以保證模板加載和運行的速度。Handlebars兼容Mustache,你可以在Handlebars中導入Mustache模板。
2. 安裝和使用
Handlebars的安裝非常簡單,你只需要從Github下載最新版本,你也可訪問下面網址獲取最新信息:http://handlebarsjs.com/。
目前handlebars.js已經被許多項目廣泛使用了,handlebars是一個純JS庫,因此你可以像使用其他JS腳本一樣用script標籤來包含handlebars.js:
1 | <script
type= "text/javascript" src= "script/handlebars-1.0.0.beta.6.js" ></script> |
3. 使用expressions
Handlebars expressions是handlebars模板中最基本的單元,使用方法是加兩個花括號{{value}}, handlebars模板會自動匹配相應的數值,對象甚至是函數。
基本expressions使用方法:
在HTML網頁中,添加需要使用模板的地方(目前Handlebars僅支持id操作):
01 | <script
id= "people-template" type= "text/x-handlebars-template" > |
04 | <h2>{{first_name}}
{{last_name}}</h2> |
05 | < div class = "phone" >{{phone}}</ div > |
06 | < div class = "email" ><a
href= "mailto:{{email}}" >{{email}}</a></ div > |
07 | < div class = "since" >User
since {{member_since}}</ div > |
在JavaScript文件中添加預編譯函數和數據:
01 | $(document).ready(function()
{ |
04 | var template =
Handlebars.compile($( "#people-template" ).html()); |
08 | {
first_name: "Alan" ,
last_name: "Johnson" ,
phone: "1234567890" ,
email: "[email protected]" ,
member_since: "Mar
25, 2011" }, |
09 | {
first_name: "Allison" ,
last_name: "House" ,
phone: "0987654321" ,
email: "[email protected]" ,
member_since: "Jan
13, 2011" }, |
10 | {
first_name: "Nick" ,
last_name: "Pettit" ,
phone: "9836592272" ,
email: "[email protected]" ,
member_since: "Apr
9, 2009" }, |
11 | {
first_name: "Jim" ,
last_name: "Hoskins" ,
phone: "7284927150" ,
email: "[email protected]" ,
member_since: "May
21, 2010" }, |
12 | {
first_name: "Ryan" ,
last_name: "Carson" ,
phone: "8263729224" ,
email: "[email protected]" ,
member_since: "Nov
1, 2008" } |
16 | $( '#list' ).html( template (data)); |
完整的demo代碼:
04 | <title>Handlebars
Expressions Example</title> |
07 | <h1>Handlebars
Expressions Example!</h1> |
08 | <!-- this is
a list which will rendered by handlebars template .
--> |
12 | <script
type= "text/javascript" src= "script/jquery.js" ></script> |
13 | <script
type= "text/javascript" src= "script/handlebars-1.0.0.beta.6.js" ></script> |
15 | <script
id= "people-template" type= "text/x-handlebars-template" > |
18 | <h2>{{first_name}}
{{last_name}}</h2> |
19 | < div class = "phone" >{{phone}}</ div > |
20 | < div class = "email" ><a
href= "mailto:{{email}}" >{{email}}</a></ div > |
21 | < div class = "since" >User
since {{member_since}}</ div > |
26 | <script
type= "text/javascript" > |
27 | $(document).ready(function()
{ |
30 | var template =
Handlebars.compile($( "#people-template" ).html()); |
34 | {
first_name: "Alan" ,
last_name: "Johnson" ,
phone: "1234567890" ,
email: "[email protected]" ,
member_since: "Mar
25, 2011" }, |
35 | {
first_name: "Allison" ,
last_name: "House" ,
phone: "0987654321" ,
email: "[email protected]" ,
member_since: "Jan
13, 2011" }, |
36 | {
first_name: "Nick" ,
last_name: "Pettit" ,
phone: "9836592272" ,
email: "[email protected]" ,
member_since: "Apr
9, 2009" }, |
37 | {
first_name: "Jim" ,
last_name: "Hoskins" ,
phone: "7284927150" ,
email: "[email protected]" ,
member_since: "May
21, 2010" }, |
38 | {
first_name: "Ryan" ,
last_name: "Carson" ,
phone: "8263729224" ,
email: "[email protected]" ,
member_since: "Nov
1, 2008" } |
42 | $( '#list' ).html( template (data)); |
Block expressions使用方法
使用Block expressions可以改變js的上下文來調用/渲染模板。
例如,我們使用helper創建一個HTML list
1 | <script
id= "people-template" type= "text/x-handlebars-template" > |
3 | {{first_name}}
{{last_name}} {{phone}} {{email}} {{member_since}} |
JavaScript文件中數據如下:
var template = Handlebars.compile($("#people-template").html());
Handlebars.registerHelper('list', function (items, options) {
var out = "<div>";
for (var i = 0, l = items.length; i < l; i++) {
out = out + "<div>" + options.fn(items[i]) + "</div>";
}
return out + "</div>";
});
添加一個名叫list的helper,funcitons(items, options)傳入兩個參數, data中的people作爲第一個參數傳入,options作爲第二個參數傳入,options附帶屬性fn,使用fn可以調用該模塊的內容。
完整的demo代碼:
04 | <title>Handlebars
Block Expressions Example</title> |
07 | <h1>Handlebars
Expressions Example!</h1> |
08 | <!-- this is
a list which will rendered by handlebars template .
--> |
12 | <script
type= "text/javascript" src= "script/jquery.js" ></script> |
13 | <script
type= "text/javascript" src= "script/handlebars-1.0.0.beta.6.js" ></script> |
15 | <script
id= "people-template" type= "text/x-handlebars-template" > |
17 | {{first_name}}
{{last_name}} {{phone}} {{email}} {{member_since}} |
21 | <script
type= "text/javascript" > |
22 | $(document).ready(function()
{ |
25 | var template =
Handlebars.compile($( "#people-template" ).html()); |
27 | Handlebars.registerHelper( 'list' ,
function (items, options) { |
30 | for (var
i = 0, l = items.length; i < l; i++) { |
31 | out
= out + "<div>" +
options.fn(items[i]) + "</div>" ; |
34 | return out
+ "</div>" ; |
39 | {
first_name: "Alan" ,
last_name: "Johnson" ,
phone: "1234567890" ,
email: "[email protected]" ,
member_since: "Mar
25, 2011" }, |
40 | {
first_name: "Allison" ,
last_name: "House" ,
phone: "0987654321" ,
email: "[email protected]" ,
member_since: "Jan
13, 2011" }, |
41 | {
first_name: "Nick" ,
last_name: "Pettit" ,
phone: "9836592272" ,
email: "[email protected]" ,
member_since: "Apr
9, 2009" }, |
42 | {
first_name: "Jim" ,
last_name: "Hoskins" ,
phone: "7284927150" ,
email: "[email protected]" ,
member_since: "May
21, 2010" }, |
43 | {
first_name: "Ryan" ,
last_name: "Carson" ,
phone: "8263729224" ,
email: "[email protected]" ,
member_since: "Nov
1, 2008" } |
47 | $( '#list' ).html( template (data)); |
With Expressions 使用方法
一般情況下,Handlebars模板會在編譯的階段的時候進行context傳遞和賦值。使用with的方法,我們可以將context轉移到數據的一個section裏面(如果你的數據包含section)。這個方法在操作複雜的template時候非常有用。直接看完整的demo代碼:
04 | <title>Handlebars
Block "with" Expressions
Example</title> |
07 | <h1>Handlebars
Expressions Example!</h1> |
08 | <!-- this is
a list which will rendered by handlebars template .
--> |
12 | <script
type= "text/javascript" src= "script/jquery.js" ></script> |
13 | <script
type= "text/javascript" src= "script/handlebars-1.0.0.beta.6.js" ></script> |
15 | <script
id= "people-template" type= "text/x-handlebars-template" > |
20 | By
{{first_name}} {{last_name}}</p> |
26 | <script
type= "text/javascript" > |
27 | $(document).ready(function()
{ |
30 | var template =
Handlebars.compile($( "#people-template" ).html()); |
34 | {
title: "first
people: " ,
author: {first_name: "Alan" ,
last_name: "Johnson" },
}, |
35 | {
title: "second
people: " ,
author: {first_name: "Jack" ,
last_name: "een" },
}, |
36 | {
title: "third
people: " ,
author: {first_name: "Tom" ,
last_name: "Peter" },
}, |
37 | {
title: "fourth
people: " ,
author: {first_name: "Asn" ,
last_name: "Smith" },
}, |
41 | $( '#list' ).html( template (data)); |
4. 使用Helpers
使用Helpers用戶可以操作handlebars模板中的數據,添加相應的邏輯等等。
用戶自定義Helpers
如本例中,添加formatPhoneNumber helpers,來對電話號碼進行格式統一化。
Template中代碼如下:
3 | <h2>{{first_name}}
{{last_name}}</h2> |
4 | < div class = "phone" >{{formatPhoneNumber
phone}}</ div > |
5 | < div class = "email" ><a
href= "mailto:{{email}}" >{{email}}</a></ div > |
6 | < div class = "since" >User
since {{member_since}}</ div > |
JavaScript中,需要使用Handlebars.registerHelper來註冊helpers,代碼:
2 | Handlebars.registerHelper( "formatPhoneNumber" ,
function(phoneNumber) { |
3 | phoneNumber
= phoneNumber.toString(); |
4 | return "(" +
phoneNumber.substr(0,3) + ")
" +
phoneNumber.substr(3,3) + "-" +
phoneNumber.substr(6,4); |
完整demo代碼:
04 | <title>Handlebars
Helpers Example</title> |
07 | <h1>Handlebars
Helpers Example!</h1> |
12 | <script
type= "text/javascript" src= "script/jquery.js" ></script> |
13 | <script
type= "text/javascript" src= "script/handlebars-1.0.0.beta.6.js" ></script> |
15 | <script
id= "people-template" type= "text/x-handlebars-template" > |
18 | <h2>{{first_name}}
{{last_name}}</h2> |
19 | < div class = "phone" >{{formatPhoneNumber
phone}}</ div > |
20 | < div class = "email" ><a
href= "mailto:{{email}}" >{{email}}</a></ div > |
21 | < div class = "since" >User
since {{member_since}}</ div > |
26 | <script
type= "text/javascript" > |
27 | $(document).ready(function()
{ |
30 | var template =
Handlebars.compile($( "#people-template" ).html()); |
33 | Handlebars.registerHelper( "formatPhoneNumber" ,
function(phoneNumber) { |
34 | phoneNumber
= phoneNumber.toString(); |
35 | return "(" +
phoneNumber.substr(0,3) + ")
" +
phoneNumber.substr(3,3) + "-" +
phoneNumber.substr(6,4); |
40 | {
first_name: "Alan" ,
last_name: "Johnson" ,
phone: "1234567890" ,
email: "[email protected]" ,
member_since: "Mar
25, 2011" }, |
41 | {
first_name: "Allison" ,
last_name: "House" ,
phone: "0987654321" ,
email: "[email protected]" ,
member_since: "Jan
13, 2011" }, |
42 | {
first_name: "Nick" ,
last_name: "Pettit" ,
phone: "9836592272" ,
email: "[email protected]" ,
member_since: "Apr
9, 2009" }, |
43 | {
first_name: "Jim" ,
last_name: "Hoskins" ,
phone: "7284927150" ,
email: "[email protected]" ,
member_since: "May
21, 2010" }, |
44 | {
first_name: "Ryan" ,
last_name: "Carson" ,
phone: "8263729224" ,
email: "[email protected]" ,
member_since: "Nov
1, 2008" } |
48 | $( '#list' ).html( template (data)); |
If helpers用法
if helpers使用方法很簡單,只需要在template中添加{{if}}, 如果有else,也一樣,添加{{else}}。Template中代碼如下:
05 | {{author.first_name}}
{{author.last_name}}</p> |
Each helpers 用法
使用each方法,可以在template中添加{{this}}, 用each來遍歷在data中是所有數據。Template中代碼如下:
5. 使用partials
當你想要複用模板的一部分,或者將長模板分割成爲多個模板方便維護時,partials就派上用場了。直接看代碼比較直接,母模板定義如下:其中用>partials 來包含相應的子模板。
1 | <script
id= "people-template" type= "text/x-handlebars-template" > |
子模板代碼:
1 | <script
id= "person-partial" type= "text/x-handlebars-template" > |
3 | <h2>{{first_name}}
{{last_name}}</h2> |
4 | < div class = "phone" >{{phone}}</ div > |
5 | < div class = "email" ><a
href= "mailto:{{email}}" >{{email}}</a></ div > |
6 | < div class = "since" >User
since {{member_since}}</ div > |
JavaScript中需要用Handlebars.registerPartial對子模板進行註冊,代碼如下:
02 | var template =
Handlebars.compile($( "#people-template" ).html()); |
05 | Handlebars.registerPartial( "person" ,
$( "#person-partial" ).html()); |
09 | {
first_name: "Alan" ,
last_name: "Johnson" ,
phone: "1234567890" ,
email: "[email protected]" ,
member_since: "Mar
25, 2011" }, |
10 | {
first_name: "Allison" ,
last_name: "House" ,
phone: "0987654321" ,
email: "[email protected]" ,
member_since: "Jan
13, 2011" }, |
11 | {
first_name: "Nick" ,
last_name: "Pettit" ,
phone: "9836592272" ,
email: "[email protected]" ,
member_since: "Apr
9, 2009" }, |
12 | {
first_name: "Jim" ,
last_name: "Hoskins" ,
phone: "7284927150" ,
email: "[email protected]" ,
member_since: "May
21, 2010" }, |
13 | {
first_name: "Ryan" ,
last_name: "Carson" ,
phone: "8263729224" ,
email: "[email protected]" ,
member_since: "Nov
1, 2008" } |
17 | $( '#list' ).html( template (data)); |
所有demo代碼下載地址: https://github.com/DaweiCheng/handlebarstutor