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
(预编译相关 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学习笔记的更多相关文章
- handlebars.js基础学习笔记
最近在帮学校做个课程网站,就有人推荐用jquery+ajax+handlebars做网站前端,刚接触发现挺高大上的,于是就把一些基础学习笔记记录下来啦. 1.引用文件: jquery.js文件下载:h ...
- amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules
amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
随机推荐
- python---连接MySQL第二页
用python向MySQL插入值.并取出被插入行的主键. #!/usr/bin/python #!coding:utf-8 import mysql.connector from mysql.conn ...
- Java输入输出流(转载)
转自http://blog.csdn.net/hguisu/article/details/7418161 目录(?)[+] 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作 ...
- GetLastError来获得错误信息转成文本描述
我们一般在调用了一些API后都会用GetLastError来获得错误信息,但是信息都是Integer的,我们知道是什么意思么?嘿嘿,是的,有msdn呀,当然还可以用FormatMessage函数来.正 ...
- linux下安装配置svn独立服务器
subversion(以下简称svn)是近年来崛起的版本管理工具,是cvs的接班人. svn服务器有2种运行方式:独立服务器和借助apache.2种方式各有利弊. file:/// 直接版本库访问(本 ...
- Reward(拓扑结构+邻接表+队列)
Reward Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ...
- .net通用权限框架C/S概览
通用权限框架cs部分 先概述一下,cs使用vs2010+sql2008 和bs公用同一个数据库 为使界面好看使用了第三方控件 donetbar和devexpress,正版是要收费的,但是你们都明白的可 ...
- Mantis的附件图片实现预览/弹出层动画效果预览图片(LightBox2)的完美解决方案[Z]
方法1: 在Mantis的配置文件中,加入此句,将这个值设的很大,就可以直接看到图片 1 $g_preview_attachments_inline_max_size=1000000; 效果如图 这个 ...
- Linux下终端利器tmux(转)
“君子生非异也,善假于物也” .–语出<荀子·劝学> 如果记得没错的话,<荀子·劝学>我们这一代高中的时候应该都读过这篇文章.原意大概是君子的资质与一般人没有什么区别,君子之所 ...
- 从C++对象内存布局和构造过程来具体分析C++中的封装、继承、多态
一.封装模型的内存布局 常见类对象的成员可能包含以下元素: 内建类型.指针.引用.组合对象.虚函数. 另一个角度的分类: 数据成员:静态.非静态 成员函数:静态.非静态.虚函数 1.仅包含内建类型的场 ...
- JVM学习之GC参数设置
1: heap size a: -Xmx 指定jvm的最大heap大小,如:-Xmx2g b: -Xms 指定jvm的最小heap大小,如:-Xms1g c: -Xmn 指定jvm中New Gener ...