安裝
Hbs的安裝有兩種方法:
1.在已有項目中使用npm安裝hbs包
npm install hbs --save
這個方法只是從npm的庫中把hbs包安裝到了項目中,要在項目中真正使用還需要進行配置,接下來會說到
2.使用exprss-generator創建一個使用hbs的項目
這個情況是,你沒有項目,而是使用express-generator這個npm包來創建一個express的項目,模板引擎選擇hbs。
npm install express-generator -g
express --hbs 項目名稱
這樣就創建好了一個express項目,模板使用的是hbs,在app.js中已經做好了配置,不需要我們再進行額外的配置就能直接寫hbs模板文件了。
配置
這裏說的配置是指對express項目進行配置,使其能夠支持hbs,針對安裝中第一種情況說的。
在app.js中找到app.set('view engine','xxx');代碼,改成如下:
app.set('view engine','hbs');
只需要這麼一句就能讓express項目使用hbs作爲默認的模板引擎了。
修改默認後綴名
如 果你看hbs這個後綴名不爽,可以修改的。修改方法很簡單,app.set('view engine','cool');這樣就能把默認後綴名修改成cool了。但是此時還不行,express根本不知道cool是什麼,還需要建立cool 跟hbs模板引擎之間的關聯關係。
app.engine('cool',require('hbs').__express);
好了,這樣我們就把默認後綴從hbs改成了cool。
express選擇模板引擎的策略
1.如果沒有後綴名,取系統設置的默認後綴名,並且根據該後綴名獲取相應的模板引擎。
2.如果有後綴名,直接使用後綴名去取相應的模板引擎。
express很容讓多種模板引擎共存,都不需要額外的配置。
爲模板提供自定義的helper
hbs 是業務邏輯無關的模板引擎(logic-less template)。所以不建議在模板文件中寫太複雜的代碼。不過對於簡單的功能在不同模板文件中多次出現,我們可以使用hbs提供的 registerHelper把代碼註冊成helper,那麼就可以在模板文件直接調用了,提高代碼重用。註冊helper的方法如下:
hbs.registerHelper('sayHello',function(){
......
});
上面代碼註冊了一個名字爲sayHello的方法,在寫模板文件時就能直接調用。該方法是可以定義參數的。調用的方法我們會在下面說到。
使用partial精簡模板
我們經常會遇見,多一個頁面的頭和尾部的代碼都是相同,爲一個不同的是中間的內容部分。這樣我們就可以使用registerPartial定義partial。在需要使用的模板文件中直接引用該partial模板文件就可以了。跟helper一樣都是代碼重用的作用。
hbs.registerPartial(name,partial);
例如:
hbs.registerPartial('header','<head><title>{{title}}</title></head>');
調用方法下面會說到。
語法
接下里說一說模板文件編寫的語法。在此之前先說一下context概念。express使用模板引擎的方式是res.render('模板文件名稱',{});第二個參數是傳給模板的數據,稱做上下文(context)。
註釋
{{!--註釋文本 --}}
{{! 註釋文本}}
這兩種都是註釋,區別在於,前者會保留下來,後者只是在模板文件中的註釋,編譯成html後就沒有了。
簡單表達式
{{name}}或{{{name}}}
從上下文中取出name屬性顯示出來。前者會對內容進行轉義,而後者不會。比如name爲<p>John</p>,前者輸出的是<p>John</p> 後者會原樣輸出。
塊表達式
{{#if condition}}
......
{{/if}}
開始標記是#關鍵字,結束是/關鍵字
調用helper
{{sayHello}}
sayHello是我們定義的helper,如果sayHello需要參數,只需要在調用的時候加上傳入的參數,如:
{{sayHello param1 param2
}}
使用partial
{{> mypartial}}
內置流程控制塊
if
{{#if 條件}}
......
{{/if}}
{{#if 條件}}
....
{{else}}
...
{{/if}}
with
它的功能是減少引用對象的深度,我們這裏假設上下文是
{
name:"少年PI的奇幻漂流",
author:{
name:"外國人",
motherland:{
name:"外國",
position:"大西洋"
}
}
}
我們在些模板時,對於祖國這一塊數據的展示,如下:
祖國:{{author.motherland.name}}
位置:{{author.motherland.position}}
是不是有很多重複的前綴,這時候就可以使用with了
{{#with author.motherland}}
祖國:name
位置:position
{{/with}}
如果層次更深,屬性更多的話,好處就很明顯了,以上例子中只有兩個屬性。
each
這是實現循環的.
{{#each arr}}
.....
{{/each}}
arr是一個集合。
自定義塊
以上介紹的是handlebars內置的,我們可以自己定義滿足自己需要的塊。定義的方法很簡單,就是使用registerHelper。
hbs.registerHelper('myblock',function(options){
return options.fn(this);
});
可以在模板中這樣調用:
{{#myblock}}
<p>這是我的myblock</p>{{title}}
{{/myblock}}
假設調用塊的這個模板文件的上下文中有title屬性,它的值是cool!,那麼上面調用產生的結果就是:
<p>這是我的myblock</p>cool!
塊定義中options.fn是調用處塊中間的模板代碼片段編譯後產生的模板方法,它是一個方法。