Basic Usage

1,最简单的handlebars 表达式

<h1>{{title}}</h1>

使用时,会在当前context里找名为title的property,替换之。

2,handlebars表达式也可以是一个带‘.’的paths

<h1>{{article.title}}</h1>

该表达式会在current context里查找article属性,在result里接着找title。如果没有传article变量,页面是不能接收到值,但也不会报错(underscore这种情况会报错)。

handlebars也支持用斜杠来替换上述"."的效果。

<h1>{{article/title}}</h1>

3,表达式可以是任意unicode character, 除了下面这些:

! " # % & ' ( ) * + , . / ; < = > @ [ \ ] ^ ` { | } ~

4,handlebars的表达式的值传到模板里时会对特殊字符进行escape,如果想要传过去的html代码能够以html的形式表现效果,而不是被当做字符串显示,就要用到{{{expression}}}。

Block Helpers

1,定义一个简单的块级helper

Handlebars.registerHelper('noop', function(options) {
return options.fn(this);
});

这个noop helper 接受一个options对象,这个对象有一个fn方法,这个方法只是简单的执行模板编译和填值,它执行时会带有一个上下文,并且会返回一个字符串。

这里的this总是指向当前的上下文(使用已经编译好的模板时传入的context)。

使用 noop helper可以如下

<div class="entry">
<h1>{{title}}</h1>
<div class="body">
{{#noop}}{{body}}{{/noop}}
</div>
</div>

2,bold helper

Handlebars.registerHelper('bold', function(options) {
return new Handlebars.SafeString(
'<div style="font-weight:bold;">'
+ options.fn(this)
+'</div>'
);
})

使用

<div class="body">
{{#bold}}{{body}}{{/bold}}
</div>

生成的html代码如下

<div class="body">
<div style="font-weight:bold;">This is my first post!</div>
</div>

3,with helper

Handlebars.registerHelper('with', function(context, options) {
return options.fn(context);
});

接收#with 后面传入的参数,将其作为context传给options.fn函数,好比将#with内的部分作为子模板再传入子模板的上下文。

使用如下:

<div class="entry">
<h1>{{title}}</h1>
{{#with story}}
<div class="intro">{{{intro}}}</div>
<div class="body">{{{body}}}</div>
{{/with}}
</div>

在context的嵌套较深的时候非常有用。

Simple Iterators

4,each helper

Handlebars.registerHelper('each', function(context, options) {
var ret = ""; for(var i=0, j=context.length; i<j; i++) {
ret = ret + options.fn(context[i]);
} return ret;
});

每次执行options.fn(context[i])都对#each之间的模板进行填值并返回字符串。

5,list helper

Handlebars.registerHelper('list', function(context, options) {
var ret = "<ul>"; for(var i=0, j=context.length; i<j; i++) {
ret = ret + "<li>" + options.fn(context[i]) + "</li>";
} return ret + "</ul>";
});

使用#list会返回一个序列。当然,在定义这个helper的时候,也可以使用别的库来让代码更简洁。

比如

Handlebars.registerHelper('list', function(context, options) {
return "<ul>" + context.map(function(item) {
return "<li>" + options.fn(item) + "</li>";
}).join("\n") + "</ul>";
});

6,conditionals

简单的#if

Handlebars.registerHelper('if', function(conditional, options) {
if(conditional) {
return options.fn(this);
}
});

如果要控制结构,比如如下使用情况

{{#if isActive}}
<img src="star.gif" alt="Active">
{{else}}
<img src="cry.gif" alt="Inactive">
{{/if}}

这时就需要在条件求值返回false时候执行的模板代码

Handlebars.registerHelper('if', function(conditional, options) {
if(conditional) {
return options.fn(this);
} else {
return options.inverse(this);
}
});

暂时学到这里,后续下回再来...

Handlebars expressions的更多相关文章

  1. handlebars.js的运用与整理

    最近在做部门的技术分享网站,主要是一些文章的列表和演讲信息展示,内容比较规律,复用性较高.同事推荐了 handlebars.js.用来看看. handlebars.js是一种静态JS模板,用起来还蛮简 ...

  2. Handlebars模板库浅析

    Handlebars模板库简单介绍 Handlebars是JavaScript一个语义模板库,通过对view(模板)和data(ajax请求的数据,一般是json)的分离来快速构建Web模板.它采用& ...

  3. Javascript模板引擎handlebars使用实例及技巧

    转:http://rfyiamcool.blog.51cto.com/1030776/1278620 我们在开发的时候针对DOM操作,用简单的JS应用来说不成问题,但如果你对视图的每次更新都需要对我文 ...

  4. Handlebars.js 模板引擎

    介绍 Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less template"(无逻辑模 ...

  5. JavaScript模板引擎Handlebars

    Handlebars模板库简单介绍 Handlebars是JavaScript一个语义模板库,通过对view(模板)和data(ajax请求的数据,一般是json)的分离来快速构建Web模板.它采用& ...

  6. Javascript模板引擎handlebars使用

    源地址:http://rfyiamcool.blog.51cto.com/1030776/1278620 代码示例: <!DOCTYPE html> <html> <he ...

  7. Handlebars模板引擎

    介绍 Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less template"(无逻辑模 ...

  8. GHOST CMS - Ghost Handlebars主题 Ghost Handlebars Themes

    Ghost Handlebars主题 Ghost Handlebars Themes Ghost主题层被设计为让开发人员和设计人员能够灵活地构建由Ghost平台支持的自定义发布 The Ghost t ...

  9. 作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars

    作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars 一.为什么需要使用模板引擎? 关于为什么要使用模板引擎,按照我常对学生说的一句话就是:不用重复造轮子..   简单来说,模板最 ...

随机推荐

  1. 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

    #include <iostream> using namespace std; int main() { int i,j,n,m,k,*p,num[100];k=m=0;   cin&g ...

  2. ecstore生成二维码

    利用phpqrcode库生成二维码: /* *二维码添加 */ ////////////////////////////////////// /*引入文件*/ @include(APP_DIR.'/i ...

  3. Clover周报模块 -- 开发总结

    2014年7月8日 00:16:05 一.切图 这次开发,切图花了不少时间,样式是用scss写的,第一次用,不过用着用着就发现它的强大,层级.作用域.重用等都非常的方便,还有考拉神器,用着真是爽!不过 ...

  4. (转载)lib 和 dll 的区别、生成以及使用详解

    简单地讲: 第一:.DLL是动态链接库,而.LIB是静态链接库dll是个编译好的程序,调用时可以直接调用其中的函数,不参加工程的编译. 而lib应该说是一个程序集, 只是把一些相应的函数总结在一起, ...

  5. Hdu1097(计算a的b次幂最后一位数值)

    #include <stdio.h> #include <math.h> int main() { int Num1,Num2; while(scanf("%d %d ...

  6. 错误日志类C#

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  7. 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

    这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ------------------------------------------------- ...

  8. Cmake,source_group

    Cmake的source_group命令相当于VS里面给编译需要的文件归类,把一些相同性质的文件放一个类里面,这些“类”,可以在VS 图形界面下左边(一般情况下),看到header文件夹下面的H文件, ...

  9. Linux企业级项目实践之网络爬虫(16)——使用base64传输二进制数据

    用http传输二进制的数据时,需要将二进制做一下转化,例如传输的int类型,将int类型之间转为char以后,丢失掉了长度的信息,如数字123456,本来只有4个字节,但是转化成文本的"12 ...

  10. 【css3+JavaScript】:一个优雅的对话框

    实现效果: 演示地址:http://codepen.io/anon/pen/BNjYrR ======2015/5/11====== 优化滚动条(scroll):默认的滚动条太丑,忍不住优化下 ::- ...