自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Handlebars模板引擎介紹和開發(fā)指南

原創(chuàng)
移動(dòng)開發(fā)
Handlebars是一個(gè)Javascript模板引擎,能讓你輕松高效的編寫語義化模板,它是Mustache模板引擎的一個(gè)擴(kuò)展,Handlebars和Mustache都是弱邏輯的模板引擎,能將Web前端的視圖和代碼分離,降低兩者之間耦合。

本文翻譯和整理自Handlebars Github官網(wǎng),當(dāng)前handlebar版本1.3.0。

介紹

Handlebars是一個(gè)Javascript模板引擎,能讓你輕松高效的編寫語義化模板,它是Mustache模板引擎的一個(gè)擴(kuò)展,Handlebars和Mustache都是弱邏輯的模板引擎,能將Web前端的視圖和代碼分離,降低兩者之間耦合。

Handlebars的特點(diǎn)是一切都是表達(dá)式,沒有data api,不污染HTML標(biāo)簽,和DeDecms、wordpress模板類似,因此能很方便的與其他前端JS庫混用,并且編寫簡(jiǎn)單,易于擴(kuò)展。

Handlebars支持的瀏覽器及運(yùn)行環(huán)境有:IE6+、Chrome、Firefox、Safari5+、Opera11+以及Node.js。

Handlebars是ember.js的默認(rèn)模板引擎,同時(shí)也是nodejs web框架Clouda、Meteor的默認(rèn)模板引擎。

安裝

Handlebars的安裝很簡(jiǎn)單,你可以從 Github官網(wǎng) 下載***版本,也可以從bower包管理器中將它添加到你的頁面上。

用法

簡(jiǎn)單來說,Handlebars里的語法是Mustache的超集,如果你想了解基礎(chǔ)的語法,可以查看Mustache的幫助頁面,下面也將講解Handlebars中的語法。

基礎(chǔ)語法

Handlebars模板看起來和一般的HTML沒什么兩樣,只不過是在HTML中嵌入了Handlebars的表達(dá)式。如下:

  1. <div class="entry"> 
  2.     <h1>{{title}}</h1> 
  3.     <div class="body"> 
  4.           {{body}} 
  5.     </div> 
  6. </div> 

一個(gè)Handlebars的表達(dá)式是被{{}}包含起來的內(nèi)容。了解更多Handlebars表達(dá)式。

你可以將模板的內(nèi)容或數(shù)據(jù)放到一個(gè)<script>標(biāo)簽里,也可以直接寫在javascript里:

  1. <script id="entry-template" type="text/x-handlebars-template"> 
  2. template content 
  3. </script> 

當(dāng)你寫了一個(gè)模板以后,使用Handlebars.compile方法將模板編譯為函數(shù),生成的執(zhí)行函數(shù)接受context作為參數(shù),用來渲染模板。了解更多執(zhí)行函數(shù)。

比如下面:

  1. var source = "<p>Hello, my name is {{name}}. I am from {{hometown}}. I have " + 
  2. "{{kids.length}} kids:</p>" + 
  3. "<ul>{{#kids}}<li>{{name}} is {{age}}</li>{{/kids}}</ul>"
  4. var template = Handlebars.compile(source); 
  5.  
  6. var data = { "name""Alan""hometown""Somewhere, TX"
  7. "kids": [{"name""Jimmy""age""12"}, {"name""Sally""age""4"}]}; 
  8. var result = template(data); 
  9.  
  10. // 將被渲染為: 
  11. // <p>Hello, my name is Alan. I am from Somewhere, TX. I have 2 kids:</p> 
  12. // <ul> 
  13. //   <li>Jimmy is 12</li> 
  14. //   <li>Sally is 4</li> 
  15. // </ul> 

你還可以預(yù)編譯你的模板,它將會(huì)生成一個(gè)小一些的運(yùn)行庫,這對(duì)移動(dòng)設(shè)備上的web頁面非常重要。了解更多預(yù)編譯。

HTML轉(zhuǎn)義

為安全起見,Handlebars表達(dá)式中的一些HTML字符將被轉(zhuǎn)義,如果你不想讓Handlebars轉(zhuǎn)義字符,使用三個(gè)花括號(hào){{{

  1. //template:  
  2.  
  3. <div class="entry"> 
  4.     <h1>{{title}}</h1> 
  5.     <div class="body"> 
  6.         {{{body}}} 
  7.     </div> 
  8. </div> 
  9.  
  10. //context: 
  11.  
  12.     title: "All about <p> Tags", 
  13.     body: "<p>This is a post about &lt;p&gt; tags</p>
  14.  
  15. //results: 
  16.  
  17. <div class="entry"> 
  18.     <h1>All About &lt;p&gt; Tags</h1> 
  19.     <div class="body"> 
  20.       <p>This is a post about &lt;p&gt; tags</p> 
  21.     </div> 
  22. </div> 

Handlebars不會(huì)轉(zhuǎn)義Handlebars.SafeString,如果你想寫一個(gè)輸出自身HTML的helper,你可以使用這個(gè)方法,用來手動(dòng)的輸出需要轉(zhuǎn)義的參數(shù)。

  1. Handlebars.registerHelper('link'function(text, url) { 
  2.   text = Handlebars.Utils.escapeExpression(text); 
  3.   url  = Handlebars.Utils.escapeExpression(url); 
  4.  
  5.   var result = '<a href="' + url + '">' + text + '</a>'
  6.  
  7.   return new Handlebars.SafeString(result); 
  8. }); 

塊級(jí)表達(dá)式

塊級(jí)表達(dá)式能讓你定義塊級(jí)helpers,它能調(diào)用模板的一部分,并且使用與當(dāng)前不同的上下文。下面以一個(gè)輸出HTML列表的helper為例:

{{#list people}}{{firstName}} {{lastName}}{{/list}}

定義如下的上下文:

  1.   people: [ 
  2.     {firstName: "Yehuda", lastName: "Katz"}, 
  3.     {firstName: "Carl", lastName: "Lerche"}, 
  4.     {firstName: "Alan", lastName: "Johnson"
  5.   ] 

我們可以創(chuàng)建一個(gè)名為list的helper來生成HTML列表,這個(gè)helper接受people和options參數(shù),options包含fn屬性,可以調(diào)用上下文。

  1. Handlebars.registerHelper('list'function(items, options) { 
  2.   var out = "<ul>"
  3.  
  4.   for(var i=0, l=items.length; i<l; i++) { 
  5.     out = out + "<li>" + options.fn(items[i]) + "</li>"
  6.   } 
  7.  
  8.   return out + "</ul>"
  9. }); 

執(zhí)行后,生成:

  1. <ul> 
  2.   <li>Yehuda Katz</li> 
  3.   <li>Carl Lerche</li> 
  4.   <li>Alan Johnson</li> 
  5. </ul> 

塊級(jí)helper包含更多的特性,如創(chuàng)建一個(gè)else部分(在內(nèi)建的if helper里有用到)。

當(dāng)調(diào)用options.fn(context)時(shí)內(nèi)部的內(nèi)容已經(jīng)被轉(zhuǎn)義,因此Handlebars不會(huì)轉(zhuǎn)義塊級(jí)helper的結(jié)果,否則會(huì)出現(xiàn)兩次轉(zhuǎn)義。了解更多塊級(jí)helper

Handlebars路徑

和Mustache一樣,Handlebars支持簡(jiǎn)單的路徑。

Handlebars還支持嵌套的路徑,可以在當(dāng)前上下文中尋找嵌套的屬性。

  1. <div class="entry"> 
  2.   <h1>{{title}}</h1> 
  3.   <h2>By {{author.name}}</h2> 
  4.  
  5.   <div class="body"> 
  6.     {{body}} 
  7.   </div> 
  8. </div> 

其對(duì)應(yīng)的上下文如下:

  1. var context = { 
  2.   title: "My First Blog Post!"
  3.   author: { 
  4.     id: 47, 
  5.     name: "Yehuda Katz" 
  6.   }, 
  7.   body: "My first post. Wheeeee!" 
  8. }; 

因此Handlebars模板能支持更多原始的JSON對(duì)象。

嵌套的handlebars路徑可以包含../字符段,可以將路徑定位到父級(jí)上下文中。

  1. <h1>Comments</h1> 
  2.  
  3. <div id="comments"> 
  4.   {{#each comments}} 
  5.   <h2><a href="/posts/{{../permalink}}#{{id}}">{{title}}</a></h2> 
  6.   <div>{{body}}</div> 
  7.   {{/each}} 
  8. </div> 

在這個(gè)例子中,post是comments的父級(jí)上下文,雖然a標(biāo)簽處于comments的上下文里,但permalink可以上溯到post上下文中。

更嚴(yán)密的講,../路徑指的是父級(jí)模板的作用域,而不是高一級(jí)的上下文,這是因?yàn)閴K級(jí)helper能調(diào)用任何上下文,所以“上一級(jí)”的概念在這里并不適合。

模板注釋

在handlebars中使用{{! }}或者{{!-- --}}來包含注釋。

  1. <div class="entry"> 
  2.   {{! only output this author names if an author exists }} 
  3.   {{#if author}} 
  4.     <h1>{{firstName}} {{lastName}}</h1> 
  5.   {{/if}} 
  6. </div> 

Helpers(輔助方法)

Helpers是Handlebars中最重要的概念,它能大大擴(kuò)展Handlebars的使用范圍,Helper自定義函數(shù)的形式將所需要的功能注冊(cè)為表達(dá)式,然后可以在Handlebars中使用。

Handlebars提供了Handlebars.registerHelper方法來自定義Helper,同時(shí)也提供了一些常用的內(nèi)建Helper。

比如有如下模板:

  1. <div class="post"> 
  2.   <h1>By {{fullName author}}</h1> 
  3.   <div class="body">{{body}}</div> 
  4.  
  5.   <h1>Comments</h1> 
  6.  
  7.   {{#each comments}} 
  8.   <h2>By {{fullName author}}</h2> 
  9.   <div class="body">{{body}}</div> 
  10.   {{/each}} 
  11. </div> 

其中上下文和helper如下:

  1. var context = { 
  2.   author: {firstName: "Alan", lastName: "Johnson"}, 
  3.   body: "I Love Handlebars"
  4.   comments: [{ 
  5.     author: {firstName: "Yehuda", lastName: "Katz"}, 
  6.     body: "Me too!" 
  7.   }] 
  8. }; 
  9.  
  10. Handlebars.registerHelper('fullName'function(person) { 
  11.   return person.firstName + " " + person.lastName; 
  12. }); 

運(yùn)行結(jié)果:

  1. <div class="post"> 
  2.   <h1>By Alan Johnson</h1> 
  3.   <div class="body">I Love Handlebars</div> 
  4.  
  5.   <h1>Comments</h1> 
  6.  
  7.   <h2>By Yehuda Katz</h2> 
  8.   <div class="body">Me Too!</div> 
  9. </div> 

Helpers還可以接受塊級(jí)元素當(dāng)前的上下文,就像函數(shù)中的this上下文一樣。

  1. <ul> 
  2.   {{#each items}} 
  3.   <li>{{agree_button}}</li> 
  4.   {{/each}} 
  5. </ul> 

上下文及helper如下:

  1. var context = { 
  2.   items: [ 
  3.     {name: "Handlebars", emotion: "love"}, 
  4.     {name: "Mustache", emotion: "enjoy"}, 
  5.     {name: "Ember", emotion: "want to learn"
  6.   ] 
  7. }; 
  8.  
  9. Handlebars.registerHelper('agree_button'function() { 
  10.   return new Handlebars.SafeString( 
  11.     "<button>I agree. I " + this.emotion + " " + this.name + "</button>" 
  12.   ); 
  13. }); 

運(yùn)行結(jié)果:

  1. <ul> 
  2.   <li><button>I agree. I love Handlebars</button></li> 
  3.   <li><button>I agree. I enjoy Mustache</button></li> 
  4.   <li><button>I agree. I want to learn Ember</button></li> 
  5. </ul> 

內(nèi)建Helpers

Handlebars提供了一系列的內(nèi)建Helper供直接調(diào)用。

with:切換上下文

each:循環(huán)輸出上下文中的內(nèi)容,用this表達(dá)式指代單條內(nèi)容,else表達(dá)式當(dāng)上下文為空時(shí)激活

if:條件表達(dá)式

unless:與if表達(dá)式功能相反

log:輸出log

責(zé)任編輯:徐川 來源: 51CTO
相關(guān)推薦

2011-12-05 14:50:13

Knockout

2014-06-12 09:35:25

設(shè)備定向API移動(dòng)開發(fā)

2011-08-02 17:58:09

iPhone開發(fā) 事件

2011-11-29 16:38:58

Knockout

2014-09-18 09:27:32

AndroidTransition框

2011-07-25 16:21:22

Sencha touc

2022-08-02 08:01:09

開發(fā)插件Chrome前端技術(shù)

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2017-01-04 15:22:57

TrimPath模板引擎

2011-06-09 18:24:36

QT Wince

2012-03-26 09:27:40

谷歌安卓開發(fā)谷歌安卓

2023-05-15 18:44:07

前端開發(fā)

2020-10-19 11:49:32

NodeJavaScript

2021-03-31 09:50:25

鴻蒙HarmonyOS應(yīng)用開發(fā)

2011-07-07 16:15:20

Smarty

2009-06-24 16:30:21

JSF組件模型

2015-11-12 16:14:52

Python開發(fā)實(shí)踐

2010-06-13 09:27:56

Widget開發(fā)

2015-12-16 10:30:18

前端開發(fā)指南

2019-10-31 08:00:00

機(jī)器學(xué)習(xí)人工智能AI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)