谈到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. MTK Androiod HAL如何向上层提供接口

    Android中HAL如何向上层提供接口总结 转自:http://blog.csdn.net/flydream0/article/details/7086273 参考文献: http://blog.c ...

  2. go 编译protobuf

    D:\project\bin\protoc.exe --plugin=protoc-gen-go=%GOPATH%\bin\protoc-gen-go.exe --go_out=. *.proto 编 ...

  3. 安卓开发学习日记 DAY1

    1.eclipse安装,很简单 2.安卓sdk manager 下载安装 sdk manager是一个安卓开发所使用的sdk文件的管理程序,可以使用这个程序在官网上下载相应的安卓的api等.因为需要在 ...

  4. 37.2 net-- tcp传输 ServerSocket、Socket

    一.打开server端 package day35_net_网络编程.tcp传输; import java.io.IOException; import java.io.InputStream; im ...

  5. Python 中如何查看进行反汇编

    dis模块       Python 反汇编是通过 dis 这个模块来查看的,一般有两种方式可以用来查看     方式一: 在命令行中使用 dis 查看   >>> def test ...

  6. Salesforce 学习 | 官方总结最实用的Spring '20新功能

    在Spring '20正式发布之前,Trailblazers 社区举行了一个名为Treasure Hunt的在线活动,通过预览沙盒,分享他们认为Spring ‘20中最重要的功能.这篇文章就来盘点一下 ...

  7. stand up meeting 1-6

    今日更新: 1.修复初始最佳战绩显示bug:  初始为击败全国0% 用户 2.挑战结果界面显示“哎,今天的饭又白吃了,回去多吃两碗###”, 去除API返回string中的“###”. 3.分享模块初 ...

  8. F - Select Half dp

    题目大意:从n个数里边选n/2个数,问和最大是多少. 题解:这是一个比较有意思的DP,定义状态dp[i][1],表示选了第i个数的最优状态,dp[i][0]表示没有选第i个数的最优状态. 状态是如何转 ...

  9. 数据结构与算法--二分搜索(binary search)

    前言 之前面试准备秋招,重新翻起了<编程之美>.在第三章节看到了一道关于二分搜索的讨论,觉得有许多细节是自己之前也没怎么特别注意地方,比如二分搜索的初始条件,转化.终止条件之类的. 问题 ...

  10. Python中Selenium模拟JQuery滑动解锁实例

    滑动解锁一直做UI自动化的难点之一,我补一篇滑动解锁的例子,希望能给初做Web UI自动化测试的同学一些思路. 首先先看个例子. https://www.helloweba.com/demo/2017 ...