Handlebars.js 模板引擎

介紹

Handlebars 是 JavaScript 一個語義模板庫,經過對view和data的分離來快速構建Web模板。它採用"Logic-less template"(無邏輯模版)的思路,在加載時被預編譯,而不是到了客戶端執行到代碼時再去編譯, 這樣能夠保證模板加載和運行的速度。Handlebars兼容Mustache,你能夠在Handlebars中導入Mustache模板。javascript

使用與安裝

Handlebars的安裝很是簡單,你只須要從Github下載最新版本,你也可訪問下面網址獲取最新信息:http://handlebarsjs.com。 
目前handlebars.js已經被許多項目普遍使用了,handlebars是一個純JS庫,所以你能夠像使用其餘JS腳本同樣用script標籤來包含handlebars.jscss

script type="text/javascript" src=".js/handlebars.js"></script> 

基本語法

Handlebars expressions 是handlebars模板中最基本的單元,使用方法是加兩個花括號{{value}}, handlebars模板會自動匹配相應的數值,對象甚至是函數。 
例如:html

<div class="demo">  
    <h1>{{name}}</h1>
    <p>{{content}}</p>
</div>  

你能夠單獨創建一個模板,ID(或者class)和type很重要,由於你要用他們來獲取模板內容 例如:java

<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屬性的值。jquery

在JavaScript中,使用Handlebars.compile()方法來預編譯模板 例如:(這是一套規則)express

//用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的上下文設爲數組中的元素。 例如:json

<ul>  
{{#programme}}
    <li>{{language}}</li>
{{/programme}}
</ul>  

有如下json數據數組

{
  programme: [
    {language: "JavaScript"},
    {language: "HTML"},
    {language: "CSS"}
  ]
}

編譯模板代碼同上…… 上面的代碼會自動匹配programme數據並展開數據,渲染DOM後就是這樣的less

<ul>  
  <li>JavaScript</li>
  <li>HTML</li>
  <li>CSS</li>
</ul>  

Handlebars的內置塊表達式(Block helper)

1.each block helper

你可使用內置的{{#each}} helper遍歷列表塊內容,用this來引用遍歷的元素 例如:jquery插件

<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" });

 這個主要應用到移動開發上面,下面我給你上兩張圖片,你就會明白了

一樣都是兩個HTML 第一個文檔是10kb 第二個是20KB 很顯然節省了流量。如今流量的費用但是很貴的哦!

相關文章
相關標籤/搜索