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