Handlebarsjs学习笔记

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
 
      
 
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}}

时间: 2024-10-07 13:32:04

Handlebarsjs学习笔记的相关文章

Handlebars学习笔记2

Handlebars是什么 Handlebars是javascript的一个语义编译模板,它可以兼容Mustache,引入的Mustache可以获得Handlebars的一些额外功能. Handlebars语句 1 <div class="entry"> 2 <h1>{{title}}</h1> //Handlebars的语句是从花括号开始{{内容}} 3 <div class="body"> 4 {{body}} 5

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Activiti 学习笔记记录(三)

上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

[原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------