handlebarsjs官网(http://handlebarsjs.com/)
 
1.引入模板
 
    在html页面中添加

 <script id="entry-template" type="text/x-handlebars-template"> template content</script>
    var source = $("#entry-template").html();     // 获取模板内容
var template = Handlebars.compile(source); //将模板编译成模板函数
var htmlStr = template (context) ; // 传入上下文对象 输出html字符串 //模板函数可传入一个可选对象作为第二参数
var htmlStr = template (context,opt) ;

data:传入此对象,用于自定义私有变量
    helpers:出入助手,在运行时会替换权限同名的助手
    partials: Pass in to provide custom partials in addition to the globally defined partials.
 
 
    预编译
 
    npm install handlebars -g
 
    handlebars <input> -f <output>
 
    编译器会将inputFile(如person.hbs)编译成模板函数,然后插入到Handlebars.templates中即Handlebars.templates.person

Handlebars.templates.person(context, options)

如果使用预编译的话 可以直接引入handlebarjs的原型依赖库
    <script src="/libs/handlebars.runtime.js"></script>
 
    预编译可选参数
    handlebars <input> -f <output> -k each -k if -k unless

  (预编译相关 http://www.zfanw.com/blog/handlebars-js-precompilation.html )
 
 
2.表达式

<h1>{{title}}</h1>     // 会在当前上下文中寻找title属性

<h1>{{article.title}}</h1>     会在当前上下文中寻找属性article,然后在查找结果中找title属性

<h1>{{article/title}}</h1>  // 也可以这样使用(此用法不建议使用 已废弃)

标识符 不能是 Whitespace ! " # % & ' ( ) * + , . / ; < = > @ [ \ ] ^ ` { | } ~
 
    如果想引用一个属性但是它的名称不是合法的标识符,可以用[]访问,比如:

{#each articles.[10].[#comments]}}

    <h1>{{subject}}</h1>

    <div> {{body}} </div>

{{/each}}

传入each的参数  articles.[10].[#comments] 等价于js对象 articles[10]['#comments']
    
    HTML转义 {{{ expression  }}}  使用3个大括号可防止html自动转义
 
    {{{link story}}}

Handlebars.registerHelper('link', function(object) {

        var url = Handlebars.escapeExpression(object.url),          // 使用escapeExpression方法 防止自动转义

          text = Handlebars.escapeExpression(object.text);

        return new Handlebars.SafeString(

        "<a href='" + url + "'>" + objecttext + "</a>"

 );});

{{{link "See more..." href=story.url class="story"}}}     // 助手添加键值对参数  可通过助手的最后一个参数options.hash获取

Handlebars.registerHelper('link', function(text, options) {
var attrs = []; for (var prop in options.hash) {
attrs.push(
Handlebars.escapeExpression(prop) + '="'
+ Handlebars.escapeExpression(options.hash[prop]) + '"');
} return new Handlebars.SafeString(
"<a " + attrs.join(" ") + ">" + Handlebars.escapeExpression(text) + "</a>"
);
});

表达式嵌套

{{outer-helper (inner-helper 'abc') 'def'}}

先会执行inner-helper助手 然后将其返回结果作为outer-helper的第一个参数

空格控制 (使用 ~ 去掉左右的空格)

 {{#each nav ~}}
<a href="{{url}}">
{{~#if test}}
{{~title}}
{{~^~}}
Empty
{{~/if~}}
</a>
{{~/each}}

上下文对象

{
nav: [
{url: 'foo', test: true, title: 'bar'},
{url: 'bar'}
]
}

输出结果

<a href="foo">bar</a><a href="bar">Empty</a>

3.块级表达式 (会改变上下文对象)

<div class="entry">
<h1>{{title}}</h1>
<div class="body">
{{#noop}}{{body}}
{{/noop}}
</div>
</div>
Handlebars.registerHelper('noop', function(options) {
return options.fn(this); // 可以在助手里直接使用 this (指代当前上下文对象)
}); Handlebars.registerHelper('if', function(conditional, options) {
if(conditional) {
return options.fn(this);
} else {
return options.inverse(this);
}
});

助手函数默认有最后一个参数options,options.fn 会渲染助手的内容,如果助手含有else部分可以调用options.inverse(context)

4.handerbarjs 路径 (使用../ 查找上层作用域中的属性)

<p>{{./name}} or {{this/name}} or {{this.name}}</p>

5.注释

{{!--  log   --}}  或 {{! log  }}

6.常用api

a.添加助手

Handlebars.registerHelper('foo', function() {});

// 一次性添加多个助手
Handlebars.registerHelper({
foo: function() { },
bar: function() { }
});

b.注销助手

 Handlebars.unregisterHelper('foo');

c.安全字符串转化,防止字符串注入   // 防止文本被自动转义

 new Handlebars.SafeString('<div>HTML Content!</div>')

d.html转义
        Handlebars.escapeExpression(string)
        原样输出html内容 ,将&, <, >, ", ', `转化成等价的实体字符串
        
    e.判断是否是数组的第一个元素@first   (@last 判断是否是数组的最后一个元素)

{{#each array}}
{{#if @first}}
First!
{{/if}}
{{/each}} {{#each array}}
{{#if @last}}
Last :(
{{/if}}
{{/each}}

f.通过 @index 可在模板中直接使遍历数组的下标

{{#each array}}
{{@index}}
{{/each}}

g.通过@key遍历对象的属性

{{#each array}}
{{@key}}
{{/each}}

Handlebarsjs学习笔记的更多相关文章

  1. handlebars.js基础学习笔记

    最近在帮学校做个课程网站,就有人推荐用jquery+ajax+handlebars做网站前端,刚接触发现挺高大上的,于是就把一些基础学习笔记记录下来啦. 1.引用文件: jquery.js文件下载:h ...

  2. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  8. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  9. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

随机推荐

  1. 在MySQL数据库建立多对多的数据表关系

    在数据库中,如果两个表的之间的关系为,多对多的关系,如:“学生表和课程表”,一个学生的可以选多门课,一门课也可以被多门学习选;根据数据库的设计原则,应当形成第三张关联表 步骤1:创建三张数据表Stud ...

  2. mongo设计(三)

    原文:http://blog.mongodb.org/post/88473035333/6-rules-of-thumb-for-mongodb-schema-design-part-3 By Wil ...

  3. 关于 java.io.IOException: open failed: EACCES (Permission denied)

    今天解决了一个问题,不得不来和大家分享.就是关于 java.io.IOException: open failed: EACCES (Permission denied)的问题,网上也有很多人把这个问 ...

  4. JLINK烧写BIN文件到nand、norflash、SDRAM

    1. 简要说明 JLink的调试功能.烧写Flash的功能都很强大,但是对于S3C2410.S3C2440的Flash操作有些麻烦:烧写Nor Flash时需要设置SDRAM,否则速率很慢:烧写Nan ...

  5. Delphi实现全局鼠标钩子

    其中涉及到的一些API,网上均能查到详细的解释,这里不再熬述.源码下载 因为是全局钩子,所以要用dll注入.用到的鼠标消息结构如下: PMouseHookStruct = ^TMouseHookStr ...

  6. node.js介绍

    官网说明: Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable ...

  7. 云服务和虚拟机的预留 IP 地址

    大家好! 我很高兴地向大家宣布,云服务和虚拟机的预留 IP 地址将自 2014年 5月 12日起正式发布.在这篇博客中,我们将演示如何管理预留 IP.将预留 IP 与云服务和虚拟机关联.定价模型和一些 ...

  8. Mobile Service更新和 Notification Hub 对Android的支持

    本周,我们要推出一些更新,使移动服务成为移动应用程序更强大.更灵活的后端,同时推出一个与移动服务或网站结合使用的免费 20MB SQL 数据库,并且将支持通过Notification Hub中的 GC ...

  9. 2014上半年acm总结(1)(入门+校赛)

    大一下学期才开始了acm,不得不说有一点迟,但是acm确实使我的生活充实了很多,,不至于像以前一样经常没事干=  = 上学期的颓废使我的c语言学的渣的一笔..靠考前突击才基本掌握了语法 寒假突然醒悟, ...

  10. web中使用扫描枪

    扫描枪实际上就是一输入设备,只不过它每次在输入的内容后面添加一个回车.因此在web中可以使用js监听回车事件.处理代码如下: jQuery(function() {        jQuery(doc ...