handlebars學習總結


安裝

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>,前者輸出的是&lt;p&gt;John&lt;/p&gt; 後者會原樣輸出。

 

塊表達式

{{#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是調用處塊中間的模板代碼片段編譯後產生的模板方法,它是一個方法。

 

資源

https://github.com/donpark/hbs

發佈了49 篇原創文章 · 獲贊 34 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章