摘要:使用這段上下文數(shù)據(jù)會(huì)得到如下結(jié)果不會(huì)再對(duì)安全字符串進(jìn)行編碼。的在模板中可以訪(fǎng)問(wèn)任何的上下文。可以通過(guò)方法注冊(cè)一個(gè)。使用這個(gè)上下文會(huì)得到事實(shí)上,可以使用表達(dá)式在任何上下文中表示對(duì)當(dāng)前的上下文的引用。
Handlebars 為你提供了一個(gè)可以毫無(wú)挫折感的高效率書(shū)寫(xiě) 語(yǔ)義化的模板 所必需的一切。
Mustache 模板和 Handlebars 是兼容的,所以你可以把Mustache模板拿來(lái)導(dǎo)入到Handlebars中,并開(kāi)始使用Handlebars所提供的更豐富的功能。
開(kāi)始Handlebars模板看起來(lái)就像是正常的Html,并使用了嵌入的 handlebars 表達(dá)式。
{{title}}
{{body}}
handlebars表達(dá)式,是以 {{ 開(kāi)始,跟一些內(nèi)容,然后以 }} 結(jié)束。
更多資料:表達(dá)式
你可以通過(guò)標(biāo)簽把一段模板加載到瀏覽器中。
在 JavaScript 中使用 Handlebars.compile 來(lái)編譯模板。
var source = $("#entry-template").html(); var template = Handlebars.compile(source);
還可以預(yù)編譯模板。這樣的話(huà),就只需要一個(gè)更小的運(yùn)行時(shí)庫(kù)文件,并且對(duì)性能來(lái)說(shuō)是一個(gè)極大的節(jié)約,因?yàn)檫@樣就不必在瀏覽器中編譯模板了。這點(diǎn)在移動(dòng)版的開(kāi)發(fā)中就更顯的非常重要了。
更多資料:預(yù)編譯
只需傳遞一個(gè)上下文context執(zhí)行模板,即可得到返回的 HTML 的值
(譯者注:通常來(lái)說(shuō)在 js 中上下文就決定了當(dāng)前函數(shù)的this的指向)
var context = {title: "My New Post", body: "This is my first post!"} var html = template(context);
得到下面的HTML
My New Post
This is my first post!
更多資料:執(zhí)行
Handlebars的 {{expression}} 表達(dá)式會(huì)返回一個(gè) HTML編碼 HTML-escape 過(guò)的值。如果不希望Handlebars來(lái)編碼這些值,使用三個(gè)大括號(hào)即可:{{{。
{{title}}
{{{body}}}
使用這段上下文(數(shù)據(jù)):
{ title: "All aboutTags", body: "
This is a post about
tags
" }
會(huì)得到如下結(jié)果:
All About
Tags
This is a post about
tags
Handlebars 不會(huì)再對(duì) Handlebars.SafeString 安全字符串進(jìn)行編碼。如果你寫(xiě)的 helper 用來(lái)生成 HTML,就經(jīng)常需要返回一個(gè) new Handlebars.SafeString(result)。在這種情況下,你就需要手動(dòng)的來(lái)編碼參數(shù)了。
Handlebars.registerHelper("link", function(text, url) { text = Handlebars.Utils.escapeExpression(text); url = Handlebars.Utils.escapeExpression(url); var result = "" + text + ""; return new Handlebars.SafeString(result); });
這樣來(lái)編碼傳遞進(jìn)來(lái)的參數(shù),并把返回的值標(biāo)記為 安全,這樣的話(huà),即便不是喲給你“三個(gè)大括號(hào)”,Handlebars 就不會(huì)再次編碼它了。
塊級(jí)表達(dá)式塊級(jí)表達(dá)式允許你定義一個(gè)helpers,并使用一個(gè)不同于當(dāng)前的上下文(context)來(lái)調(diào)用你模板的一部分。現(xiàn)在考慮下這種情況,你需要一個(gè)helper來(lái)生成一段 HTML 列表:
{{#list people}}{{firstName}} {{lastName}}{{/list}}
并使用下面的上下文(數(shù)據(jù)):
{ people: [ {firstName: "Yehuda", lastName: "Katz"}, {firstName: "Carl", lastName: "Lerche"}, {firstName: "Alan", lastName: "Johnson"} ] }
此時(shí)需要?jiǎng)?chuàng)建一個(gè) 名為 list 的 helper 來(lái)生成這段 HTML 列表。這個(gè) helper 使用 people 作為第一個(gè)參數(shù),還有一個(gè) options 對(duì)象(hash哈希)作為第二個(gè)參數(shù)。這個(gè) options 對(duì)象有一個(gè)叫 fn 的屬性,你可以傳遞一個(gè)上下文給它(fn),就跟執(zhí)行一個(gè)普通的 Handlebars 模板一樣:
Handlebars.registerHelper("list", function(items, options) { var out = "
執(zhí)行之后,這個(gè)模板就會(huì)渲染出:
塊級(jí)的 helpers 還有很多其他的特性,比如可以創(chuàng)建一個(gè) else 區(qū)塊(例如,內(nèi)置的 if helper 就是用 else)。
注意,因?yàn)樵谀銏?zhí)行 options.fn(context) 的時(shí)候,這個(gè) helper 已經(jīng)把內(nèi)容編碼一次了,所以 Handlebars 不會(huì)再對(duì)這個(gè) helper 輸出的值進(jìn)行編碼了。如果編碼了,這些內(nèi)容就會(huì)被編碼兩 次!
更多資料:塊級(jí)Helpers
譯文在此
Handlebars 支持簡(jiǎn)單的路徑,就像Mustache那樣。
{{name}}
Handlebars 同樣也支持嵌套的路徑,這樣的話(huà)就可以在當(dāng)前的上下文中查找內(nèi)部嵌套的屬性了。
{{title}}
By {{author.name}}
{{body}}
上面的模板使用下面這段上下文:
var context = { title: "My First Blog Post!", author: { id: 47, name: "Yehuda Katz" }, body: "My first post. Wheeeee!" };
這樣一來(lái) Handlebars 就可以直接把JSON數(shù)據(jù)拿來(lái)用了。
巢狀嵌套的 handlebars 路徑也可以使用 ../, 這樣會(huì)把路徑指向父級(jí)(上層)上下文。
Comments
{{#each comments}}{{title}}
{{body}}{{/each}}
盡管 a 鏈接在輸出時(shí)是以 comment 評(píng)論為上下文的,但它仍然可以退回上一層的上下文(post上下文)并取出permalink(固定鏈接)值。
(譯者注)上下文數(shù)據(jù)應(yīng)該如下所示(源文檔并沒(méi)有給出)
var context = { post: { body:"這是文章內(nèi)容", permalink: "http://xx.com/xx", comments:[{ title:"這篇文章不錯(cuò),贊一個(gè)" },{ title:"好文要頂!" }] } }
../ 標(biāo)識(shí)符表示對(duì)模板的父級(jí)作用域的引用,并不表示在上下文數(shù)據(jù)中的上一層。這是因?yàn)閴K級(jí) helpers 可以以任何上下文來(lái)調(diào)用一個(gè)塊級(jí)表達(dá)式,所以這個(gè)【上一層】的概念用來(lái)指模板作用域的父級(jí)更有意義些。
Handlebars也允許通過(guò)一個(gè) this 的引用來(lái)解決 helpers 和 數(shù)據(jù)字段間的名字沖突:
{{./name}} or {{this/name}} or {{this.name}}
上面的這一種方式都會(huì)將 name 字段引用到當(dāng)前上下文上,而不是 helper 上的同名屬性。
模板注釋?zhuān)簕{! }} 或 {{!-- --}}你可以在 handlebars 代碼中加注釋?zhuān)透诖a中寫(xiě)注釋一樣。對(duì)于有一定程度的邏輯的部分來(lái)說(shuō),這倒是一個(gè)很好的實(shí)踐。
{{! only output this author names if an author exists }} {{#if author}}{{firstName}} {{lastName}}
{{/if}}
注釋是不會(huì)最終輸出到返回結(jié)果中的。如果你希望把注釋展示出來(lái),就使用 HTML 的注釋就行了。
{{! This comment will not be in the output }}
所有注釋都必須有 }},一些多行注釋可以使用 {{!-- --}} 語(yǔ)法。
HelpersHandlebars 的 helpers 在模板中可以訪(fǎng)問(wèn)任何的上下文。可以通過(guò) Handlebars.registerHelper 方法注冊(cè)一個(gè) helper。
By {{fullName author}}
{{body}}Comments
{{#each comments}}By {{fullName author}}
{{body}}{{/each}}
當(dāng)時(shí)用下面的上下文數(shù)據(jù)和 helpers:
var context = { author: {firstName: "Alan", lastName: "Johnson"}, body: "I Love Handlebars", comments: [{ author: {firstName: "Yehuda", lastName: "Katz"}, body: "Me too!" }] }; Handlebars.registerHelper("fullName", function(person) { return person.firstName + " " + person.lastName; });
會(huì)得到如下結(jié)果:
By Alan Johnson
I Love HandlebarsComments
By Yehuda Katz
Me Too!
Helpers 會(huì)把當(dāng)前的上下文作為函數(shù)中的 this 上下文。
當(dāng)使用下面的 this上下文 和 helpers:
var context = { items: [ {name: "Handlebars", emotion: "love"}, {name: "Mustache", emotion: "enjoy"}, {name: "Ember", emotion: "want to learn"} ] }; Handlebars.registerHelper("agree_button", function() { return new Handlebars.SafeString( "" ); });
會(huì)得到如下結(jié)果:
如果你不希望你的 helper 返回的 HTML 值被編碼,就請(qǐng)務(wù)必返回一個(gè) new Handlebars.SafeString
內(nèi)置的 Helpers with helper一般情況下,Handlebars 模板在計(jì)算值時(shí),會(huì)把傳遞給模板的參數(shù)作為上下文。
var source = "{{lastName}}, {{firstName}}
"; var template = Handlebars.compile(source); template({firstName: "Alan", lastName: "Johnson"});
結(jié)果如下:
Johnson, Alan
不過(guò)也可以在模板的某個(gè)區(qū)域切換上下文,使用內(nèi)置的 with helper即可。
{{title}}
{{#with author}}By {{firstName}} {{lastName}}
{{/with}}
在使用下面數(shù)據(jù)作為上下文時(shí):
{ title: "My first post!", author: { firstName: "Charles", lastName: "Jolley" } }
會(huì)得到如下結(jié)果:
each helperMy first post!
By Charles Jolley
你可以使用內(nèi)置的 each helper 來(lái)循環(huán)一個(gè)列表,循環(huán)中可以使用 this 來(lái)代表當(dāng)前被循環(huán)的列表項(xiàng)。
使用這個(gè)上下文:
{ people: [ "Yehuda Katz", "Alan Johnson", "Charles Jolley" ] }
會(huì)得到:
事實(shí)上,可以使用 this 表達(dá)式在任何上下文中表示對(duì)當(dāng)前的上下文的引用。
還可以選擇性的使用 else ,當(dāng)被循環(huán)的是一個(gè)空列表的時(shí)候會(huì)顯示其中的內(nèi)容。
{{#each paragraphs}}{{this}}
{{else}}No content
{{/each}}
在使用 each 來(lái)循環(huán)列表的時(shí)候,可以使用 {{@index}} 來(lái)表示當(dāng)前循環(huán)的索引值。
{{#each array}} {{@index}}: {{this}} {{/each}}
對(duì)于 object 類(lèi)型的循環(huán),可以使用 {{@key}} 來(lái)表示:
{{#each object}} {{@key}}: {{this}} {{/each}}if helper
if 表達(dá)式可以選擇性的渲染一些區(qū)塊。如果它的參數(shù)返回 false, undefined, null, "" 或 [](譯注:還有 0)(都是JS中的“假”值),Handlebars 就不會(huì)渲染這一塊內(nèi)容:
{{#if author}}{{firstName}} {{lastName}}
{{/if}}
當(dāng)時(shí)用一個(gè)空對(duì)象({})作為上下文時(shí),會(huì)得到:
在使用 if 表達(dá)式的時(shí)候,可以配合 {{else}} 來(lái)使用,這樣當(dāng)參數(shù)返回 假 值時(shí),可以渲染 else 區(qū)塊:
unless helper{{#if author}}{{firstName}} {{lastName}}
{{else}}Unknown Author
{{/if}}
unless helper 和 if helper 是正好相反的,當(dāng)表達(dá)式返回假值時(shí)就會(huì)渲染其內(nèi)容:
{{#unless license}}WARNING: This entry does not have a license!
{{/unless}}
如果在當(dāng)前上下文中查找 license 返回假值,Handlebars 就會(huì)渲染這段警告信息。反之,就什么也不輸出。
log helperlog helper 可以在執(zhí)行模板的時(shí)候輸出當(dāng)前上下文的狀態(tài)。
{{log "Look at me!"}}
這樣會(huì)把委托信息發(fā)送給 Handlebars.logger.log,而且這個(gè)函數(shù)可以重寫(xiě)來(lái)實(shí)現(xiàn)自定義的log。
轉(zhuǎn)載請(qǐng)注明來(lái)自[超2真人]
本文鏈接:http://www.peichao01.com/static_content/doc/html/introduce-handlebars.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/77945.html
摘要:其實(shí)是定義了一個(gè)入口文件,這個(gè)就不細(xì)說(shuō)了,參考官方文檔這個(gè)是英文的,大家可以自行百度其他文檔。 最近在某網(wǎng)站看到了handlebars.js,出于好奇就百度了下這是神馬玩意,結(jié)果讓我很是歡喜,于是就開(kāi)始自學(xué)下,handlebars就幾個(gè)方法,蠻簡(jiǎn)單,言歸正傳! 以下是基本教學(xué)邏輯演示,會(huì)附完整代碼 測(cè)試案例就分為3大塊,頭、主體、尾: 先來(lái)講講id=contact主體有些什么內(nèi)...
摘要:如果沒(méi)有看過(guò)之前一篇博客的,或者對(duì)的腳手架沒(méi)有了解過(guò)的同學(xué),推薦先看上一篇如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的腳手架。它是一個(gè)用來(lái)構(gòu)建靜態(tài)網(wǎng)站的類(lèi)庫(kù),也能夠用來(lái)對(duì)文件進(jìn)行處理。有任何問(wèn)題歡迎進(jìn)行交流。 前言 在之前一篇博客介紹了關(guān)于Node腳手架的一些基礎(chǔ)的知識(shí),這篇博客是在之前的基礎(chǔ)上針對(duì)在Node中開(kāi)發(fā)腳手架中遇到的問(wèn)題,如: 終端樣式、交互問(wèn)題 文件處理問(wèn)題 通過(guò)對(duì)Vue-cli 2.9.2的...
摘要:項(xiàng)目介紹風(fēng)格的一套系統(tǒng),前端采用作為前端框架,后端采用作為服務(wù)框架,采用自封裝的對(duì)所有請(qǐng)求進(jìn)行參數(shù)校驗(yàn),以保證接口安全性。 skyeye 項(xiàng)目介紹 win10風(fēng)格的一套系統(tǒng),前端采用layui作為前端框架,后端采用SpringBoot作為服務(wù)框架,采用自封裝的xml對(duì)所有請(qǐng)求進(jìn)行參數(shù)校驗(yàn),以保證接口安全性。 項(xiàng)目地址:https://gitee.com/doc_wei01_a...該項(xiàng)...
摘要:簡(jiǎn)單來(lái)說(shuō),模板最本質(zhì)的作用是變靜為動(dòng),一切利于這方面的都是優(yōu)勢(shì),不利于的都是劣勢(shì)。二選擇的原因全球最受歡迎的模板引擎是全球使用率最高的模板引擎,所以當(dāng)之無(wú)愧是全球最受歡迎的模板引擎。創(chuàng)建更為復(fù)雜一些,當(dāng)時(shí)功能更加強(qiáng)大。 showImg(https://segmentfault.com/img/bVbb3kg?w=775&h=216); 為什么需要使用模板引擎? 關(guān)于為什么要使用模板引擎...
閱讀 2666·2021-11-23 09:51
閱讀 1651·2021-11-22 13:54
閱讀 2790·2021-11-18 10:02
閱讀 948·2021-08-16 10:57
閱讀 3563·2021-08-03 14:03
閱讀 1880·2019-08-30 15:54
閱讀 3535·2019-08-23 14:39
閱讀 607·2019-08-23 14:26