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. FileProvider是个什么东西?

    FileProvider是个什么东西? 在<读取并监控文件的变化>中,我们通过三个简单的实例演示从编程的角度对文件系统做了初步的体验,接下来我们继续从设计的角度来继续认识它.这个抽象的文件 ...

  2. document.ready()的用法

    1.Jquery是优秀的Javascrīpt框架,$是jquery库的申明,它很不稳定(我就常遇上),换一种稳定的写法jQuery.noConflict(); jQuery(document).rea ...

  3. MySQL优化GROUP BY-松散索引扫描与紧凑索引扫描

    满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累积函数(如果有).在某些情况中,MySQL能够做得更好,即通过索引 ...

  4. c++犯过的严重错误

    1.if(num == 0)写成了if(num = 0)导致软件运行一直崩溃且找不到原因,浪费了很大的代价,以后我写这种语法的时候一直写if(0 == num) 2.if (sting.find(&q ...

  5. Android提高第十一篇之模拟信号示波器

    上次简单地介绍了AudioRecord和AudioTrack的使用,这次就结合SurfaceView实现一个Android版的手机模拟信号示波器(PS:以前也讲过J2ME版的手机示波器).最近物联网炒 ...

  6. JavaScript字符串插入、删除、替换函数

    JavaScript字符串插入.删除.替换函数 说明: 以下函数中前两个函数取出查找字符串的前一部分和后一部分,以用于其他函数.注意,调用一次 replaceString(mainStr,search ...

  7. CSS 垂直居中的5种实现方法

    利用 CSS 来实现对象的垂直居中有许多不同的方法,比较难的是选择那个正确的方法.我下面说明一下我看到的好的方法和怎么来创建一个好的居中网站.         使用 CSS 实现垂直居中并不容易.有些 ...

  8. rem vh vw vmin vmax ex ch

    rem 我们首先介绍下和我们熟悉的很相似的货.em 被定义为相对于当前对象内文本的字体大小.如果你给body小哥设置了font-size字体大小,那么body小哥的任何子元素的1em就是等于body设 ...

  9. DropDownList四级联动

    前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="iframe_dro ...

  10. linux下不重启加硬盘

    linux下热加载磁盘 临时给虚拟机加了一块硬盘,增加后懒得重启,于是看了看热加载 [root@centos5 ~]# cat /proc/scsi/scsi Attached devices: Ho ...