谈到handlebars,我们不禁产生疑问,为什么要使用这样的一个工具呢?它究竟能为我们带来什么样的好处?如何使用它呢?

一、handlebars可以干什么?

首先,我们来看一个案例:

有这样的html结构:

		<div class="demo">
<h1>name</h1>
<p>content</p>
</div>

这个结构会在html文件中反复使用,并且每次h1和p标签的内容都不同。

一种常见的做法是:

每次都写一遍该结构。

这样难免显得过于繁琐!

我们是否可以将html结构提取出来,每次传入不同的值来达到目的呢?

当然可以,这便是handlebars模板引擎的最简单的应用。

二、handlebars环境配置

要使用handlebars,首先是要引入handlebars。

例如,我们要在index.html文件中使用handlebars,可以通过cdn用script标签引入:

<script src="https://cdn.bootcss.com/handlebars.js/4.0.11/handlebars.min.js"></script>

也可以下载handlebars,然后用script标签引入,如:

<script type="text/javascript" src="./handlebars.js"></script>

三、模板、expressions

handlebars声称模板引擎,显然它的使用离不开模板。就像下面这样:

	<script type="text/x-handlebars-template" id="tpl">
<div class="demo">
<h1>{{name}}</h1>
<p>{{content}}</p>
</div>
</script>

首先我们使用了一个script标签,并将type属性设置为"text/x-handlebars-template",这表明我们声明了一个handlebars模板,这个模板的id为"tpl"。

你可能不知道{{name}}和{{content}}的意思,这是handlebars的expressions,形如{{value}}。handlebars模板会自动匹配{{value}},并将其替换为value的值,value可以是对象甚至是函数。你可能产生疑问:这里,模板中的name和content从何而来呢?

的确,在使用handlebars模板的时候,需要为模板传入name和content的值,后文我们再详述。

我们已经发现,handlebars模板是一个script标签,我们如何将其插入HTML中呢?

四、编译、渲染

为了将handlebars模板插入HTML,我们在index.html的body标签中输入如下代码:

(为了简化操作,我们在以下代码之前先引入了jquery。)

	<script type="text/javascript">
var obj={name:'lsz',content:'handlebars is good!'};//定义一个对象用于存放需要插入模板的数据
var t=$('#tpl').html();//获取到handlebars模板,并将其中的html代码转换成html字符串,t是字符串
console.log(t);
var f=Handlebars.compile(t);//使用handlebars对转换后的html字符串进行编译,f是函数
console.log(f);
var h=f(obj);//将obj作为参数传入f函数,实现将数据插入模板之中,h是html字符串
console.log(h);
$('body').html(h);//将插入数据后的html字符串转换为dom元素,插入到body元素中,
</script>

由此我们总结出使用handlebars模板的步骤:

1、通过dom操作获取handlebars模板;

2、对handlebars模板进行编译,得到函数;

3、给函数传入参数并运行;

4、将函数返回值插入dom。

我们可以封装一个函数专门用于渲染:(也是在安装了jquery的情况下)

	function renderTemplate(templateSelector,data,htmlSelector) {
var t=$(templateSelector).html();
var f=Handlebars.compile(t);
var h=f(data);
$(htmlSelector).html(h);
}

前面我们已经谈到函数的参数传值是按值传递,对于以上的函数,我们可能产生疑问:

templateSelector、htmlSelector仅仅得到传入字符串的副本,data得到的是传入对象的内存地址的副本,是否真能影响dom树结构呢?

答案是显然的,这是因为:

虽然templateSelector、htmlSelector的确得到字符串副本,但实际起作用的是函数内部的jquery语句,jquery语句通过templateSelector、htmlSelector的值获取了dom元素,故而会影响dom树结构。

handlebars模板引擎使用初探1的更多相关文章

  1. Handlebars模板引擎中的each嵌套及源码浅读

    若显示效果不佳,可移步到愚安的小窝 Handlebars模板引擎作为时下最流行的模板引擎之一,已然在开发中为我们提供了无数便利.作为一款无语义的模板引擎,Handlebars只提供极少的helper函 ...

  2. Handlebars模板引擎之高阶

    Helpers 其实在Handlebars模板引擎之进阶我想说if else的功能的,可是由于这个功能在我的开发中我觉的鸡肋没啥用,就直接不用了. 因为if else只能进行简单判断,如果条件参数返回 ...

  3. Handlebars 模板引擎之前后端用法

    前言 不知不觉间,居然已经这么久没有写博客了,坚持还真是世界上最难的事情啊. 不过我最近也没闲着,辞工换工.恋爱失恋.深圳北京都经历了一番,这有起有落的生活实在是太刺激了,就如拿着两把菜刀剁洋葱一样, ...

  4. doT js 模板引擎【初探】要优雅不要污

    js中拼接html,总是感觉不够优雅,本着要优雅不要污,决定尝试js模板引擎. JavaScript 模板引擎 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注. ...

  5. express-9 Handlebars模板引擎(2)

    视图和布局 视图通常表现为网站上的各个页面(它也可以表现为页面中AJAX局部加载的内容,或一封电子邮件,或页面上的任何东西).默认情况下,Express会在views子目录中查找视图.布局是一种特殊的 ...

  6. express-8 Handlebars模板引擎(1)

    简介 使用JavaScript生成一些HTML document.write('<h1>Please Don\'t Do This</h1>'); document.write ...

  7. Handlebars模板引擎之上手

    handlebars Handlebars,一个JavaScript模板引擎,是基于Mustache的扩展.模板引擎的都存在一个上下文环境,这是它的作用区间. 需求:基本使用 需要的库 <scr ...

  8. Handlebars模板引擎之进阶

    取得索引 我想取得索引作为序号这个是常用的.在handlebars也是存在的. 就是使用 @index 来获取索引 {{#each this}} <tr> <td>{{ @in ...

  9. 【转】在Express项目中使用Handlebars模板引擎

    原文:http://fraserxu.me/2013/09/12/Using-Handlebarsjs-with-Expressjs/ 最近在用Expressjs做一个项目,前后端都用它来完成.自己之 ...

随机推荐

  1. Unity 游戏框架搭建 2019 (二十七) 弃用的代码警告解决

    在前两篇,我们把所有的示例重头到尾整理了一遍. 当前的状态如下: 要做的事情: (完成) 备份:导出文件,并取一个合理的名字. 遗留问题: (完成) 第八个示例与之前的示例代码重复,功能重复. (完成 ...

  2. System.out.println()的真实含义

    每一个人的Java学习之路上恐怕都是用以下代码开始的吧? public class Test { public static void main(String[] args) { System.out ...

  3. TP字段加一操作

    经常有需要对某个数据表的计数字段进行加减操作,我们来看下在ThinkPHP中的具体使用办法.最简单的,使用下面方法对score自动加1: M('User')->where('id=5')-> ...

  4. Python操作rabbitmq系列(六):进行RPC调用

    此刻,我们已经进入第6章,是官方的最后一个环节,但是,并非本系列的最后一个环节.因为在实战中还有一些经验教训,并没体现出来.由于马上要给同事没培训celery了.我也来不及写太多.等后面,我们再慢慢补 ...

  5. C#多线程系列(3):原子操作

    本章主要讲述多线程竞争下的原子操作. 目录 知识点 竞争条件 线程同步 CPU时间片和上下文切换 阻塞 内核模式和用户模式 Interlocked 类 1,出现问题 2,Interlocked.Inc ...

  6. PHP 5.6连接MySQL 8.0版本遇到的坑

    一.数据库失败Warning: mysqli_connect(): The server requested authentication method unknown to t... <?ph ...

  7. MVC学习的心路历程

    2020/4/17 之前接触过三层架构,但是没有接触过mvc,所以有点蒙,所以现在在一步步构建思路. 1.了解MVC的发展,做一个简单的项目.

  8. Cucumber(2)——目录结构以及基本语法

    目录 回顾 HelloWorld 扩展 回顾 在上一节中,我大致的介绍了一下cucumber的特点,以及基于ruby和JavaScript下关于cucumber环境的配置,如果你还没有进行相关的了解或 ...

  9. kioptrix靶机记录

    靶机地址:172.16.1.193 Kali地址:172.16.1.107 首页为Apache测试页,没看到有价值信息 尝试目录扫描: 点击查看: http://172.16.1.193/index. ...

  10. 小知识点:session的存放位置

    在php.ini里的配置session.save_path是注释掉的,那么Seesion保存的路径在不同类型操作系统保存在什么位置? Linux: /tmp 或 /var/lib/php/sessio ...