首页 > Handlebars模板引擎

Handlebars模板引擎

介绍

Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板。它采用"Logic-less template"(无逻辑模版)的思路,在加载时被预编译,而不是到了客户端执行到代码时再去编译, 这样可以保证模板加载和运行的速度。Handlebars兼容Mustache,你可以在Handlebars中导入Mustache模板。

使用与安装

Handlebars的安装非常简单,你只需要从Github下载最新版本,你也可访问下面网址获取最新信息:http://handlebarsjs.com。 

目前handlebars.js已经被许多项目广泛使用了,handlebars是一个纯JS库,因此你可以像使用其他JS脚本一样用script标签来包含handlebars.js

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

基本语法

Handlebars expressions 是handlebars模板中最基本的单元,使用方法是加两个花括号{ {value}}, handlebars模板会自动匹配相应的数值,对象甚至是函数。 

例如:

<div class="demo">  <h1>{ {name}}h1> <p>{ {content}}p> div> 

你可以单独建立一个模板,ID(或者class)和type很重要,因为你要用他们来获取模板内容 例如:

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

handlebars会根据上下文来自动对表达式进行匹配,如果匹配项是个变量,则会输出变量的值,如果匹配项是个函数,则函数会被调用。 

如果没找到匹配项,则没有输出。表达式也支持点操作符,因此你可以使用{ {content.title}}这样的形式来调用嵌套的值或者方法, handlebars会根据当前上下文输出content变量的title属性的值。

在JavaScript中,使用Handlebars.compile()方法来预编译模板 例如:(这是一套规则)

    //用jquery获取模板var tpl   =  $("#tpl").html();//原生方法var source = document.getElementById('#tpl').innerHTML; //预编译模板 var template = Handlebars.compile(source); //模拟json数据 var context = { name: "zhaoshuai", content: "learn Handlebars"}; //匹配json内容 var html = template(context); //输入模板 $(body).html(html); 

Handlebar的表达式

Block表达式

有时候当你需要对某条表达式进行更深入的操作时,Blocks就派上用场了,在Handlebars中,你可以在表达式后面跟随一个#号来表示Blocks,然后通过{ {/表达式}}来结束Blocks。 如果当前的表达式是一个数组,则Handlebars会“自动展开数组”,并将Blocks的上下文设为数组中的元素。 例如:

<ul>  
{ {#programme}}<li>{ {language}}li> { {/programme}} ul> 

有以下json数据

{programme: [{language: "JavaScript"},{language: "HTML"},{language: "CSS"}]
}

编译模板代码同上…… 上面的代码会自动匹配programme数据并展开数据,渲染DOM后就是这样的

<ul>  <li>JavaScriptli> <li>HTMLli> <li>CSSli> ul> 

Handlebars的内置块表达式(Block helper)

1.each block helper

你可以使用内置的{ {#each}} helper遍历列表块内容(单个元素的数组),用this来引用遍历的元素 例如:

<ul>  { {#each name}}<li>{ {this}}li> { {/each}} ul> 

对应适用的json数据

{name: ["html","css","javascript"]
};

这里的this指的是数组里的每一项元素,和上面的Block很像,但原理是不一样的这里的name是数组,而内置的each就是为了遍历数组用的,更复杂的数据也同样适用。

2.if else block helper

{ {#if}}就你使用JavaScript一样,你可以指定条件渲染DOM,如果它的参数返回false,undefined, null, "" 或者 [] (a "falsy" value), Handlebar将不会渲染DOM,如果存在{ {#else}}则执行{ {#else}}后面的渲染 

例如:

{ { #if list}}
    "list"> { { #each list}}
  • { { this}}
  • { {/each}}
{ { else}}

{ {error}}

{ {/if}}

对应适用json数据

var data = {  info:['HTML5','CSS3',"WebGL"],"error":"数据取出错误"
}

这里{ {#if}}判断是否存在list数组,如果存在则遍历list,如果不存在输出错误信息

3.unless block helper

{ {#unless}}这个语法是反向的if语法也就是当判断的值为false时他会渲染DOM 例如:

{ {#unless data}}
<ul id="list">  { {#each list}}<li>{ {this}}li> { {/each}} ul> { {else}} <p>{ {error}}p> { {/unless}} 

4.with block helper

{ {#with}}一般情况下,Handlebars模板会在编译的阶段的时候进行context传递和赋值。使用with的方法,我们可以将context转移到数据的一个section里面(如果你的数据包含section)。 这个方法在操作复杂的template时候非常有用。

<div class="entry">  <h1>{ {title}}h1> { {#with author}} <h2>By { {firstName}} { {lastName}}h2> { {/with}} div> 

对应适用json数据

{title: "My first post!",author: {firstName: "Charles",lastName: "Jolley"}
}

Handlebar的注释(comments)

Handlebars也可以使用注释写法如下

{ {! handlebars comments }}

Handlebars的访问(Path)

Handlebar支持路径和mustache,Handlebar还支持嵌套的路径,使得能够查找嵌套低于当前上下文的属性 

可以通过.来访问属性也可以使用../,来访问父级属性。 例如:(使用.访问的例子)

<h1>{ {author.id}}h1>  

对应json数据

{title: "My First Blog Post!",author: {id: 47,name: "Yehuda Katz"},body: "My first post. Wheeeee!"};

例如:(使用../访问)

{ { #with person}}

{ {../company.name}}

{ {/with}}

对应适用json数据

{"person":{ "name": "Alan" }, company: {"name": "Rad, Inc." } }; 

自定义helper

Handlebars,可以从任何上下文可以访问在一个模板,你可以使用Handlebars.registerHelper()方法来注册一个helper。

调试技巧

把下面一段"debug helper"加载到你的JavaScript代码里,然后在模板文件里通过{ {debug}}或是{ {debug someValue}}方便调试数据

Handlebars.registerHelper("debug", function(optionalValue) {  console.log("Current Context"); console.log("===================="); console.log(this); if (optionalValue) { console.log("Value"); console.log("===================="); console.log(optionalValue); } }); 

handlebars的jquery插件

(function($) {var compiled = {};$.fn.handlebars = function(template, data) { if (template instanceof jQuery) { template = $(template).html(); } compiled[template] = Handlebars.compile(template); this.html(compiled[template](data)); }; })(jQuery); $('#content').handlebars($('#template'), { name: "Alan" });

转载于:https://www.cnblogs.com/gopark/p/8145949.html

更多相关:

  • 从https://github.com/haotian-wang/google-access-helper下载下来的文件夹解压   访问chrome://extensions,勾选☑开发者模式,点击“加载已解压的扩展程序…”,选择刚才解压的文件路径目录,这样就可以了,每次启动Chrome都会提示“请停止以开发者模式运行的扩展程序”...

  • 最全19000+国外AE模板合集包 此套模板 包含整理好的 2015-2021年6月 国外AE模板 19000多个 大小:3500+G 模板已编号,含预览视频,方便预览和查找,(少数模板无预览,少数模板只含预览图) 云桥网络 平台获取素材 包含AE常用软件及插件 和安装介绍 包含AE基础教程 及模板修改通用说明...

  • 设置commit 提交模板 建议提交 (.template)模板文件 放在用户目录(Doceuments)下 (~/Doceuments) 原文连接: https://blog.csdn.net/mafei852213034/article/details/51908049 内容: 1、在根目录建立模板文件 如 xxx_te...

  • 我写了一个对拍模板,套上直接可以用,还有使用说明在里面,这里附上github网站。 对拍全套模板 转载于:https://www.cnblogs.com/yichuan-sun/p/9624162.html...

  • 本文是西门子开放式TCP通信的第2篇,上一篇我们讲了使用西门子1200PLC作为TCP服务器的程序编写,可以点击下方链接阅读:【公众号dotNet工控上位机:thinger_swj】基于Socket访问西门子PLC系列教程(一)在完成上述步骤后,接下来就是编写上位机软件与PLC之间进行通信。上位机UI界面设计如下图所示:从上图可以看出...

  • 我有一个大型数据集,列出了在全国不同地区销售的竞争对手产品。我希望通过使用这些新数据帧名称中的列值的迭代过程,根据区域将该数据帧分成几个其他区域,以便我可以分别处理每个数据帧-例如根据价格对每个地区的信息进行排序,以了解每个地区的市场情况。我给出了以下数据的简化版本:Competitor Region ProductA Product...

  • 作为一名IT从业者,我来回答一下这个问题。首先,对于具有Java编程基础的人来说,学习Python的初期并不会遇到太大的障碍,但是要结合自己的发展规划来制定学习规划,尤其要重视学习方向的选择。Java与Python都是比较典型的全场景编程语言,相比于Java语言来说,当前Python语言在大数据、人工智能领域的应用更为广泛一些,而且大...

  • 这段时间通过学习相关的知识,最大的变化就是看待事物更加喜欢去了解事物后面的本质,碰到问题后解决问题思路也发生了改变。举个具体的例子,我在学习数据分析,将来会考虑从事这方面的工作,需要掌握的相关专业知识这个问题暂且按下不表,那哪些具体的问题是我需要了解的呢,以下简单罗列:1、了解数据分析师这个岗位在各个地区的需求情况?2、数据分析师的薪...

  • 这一节将开始学习python的一个核心数据分析支持库---pandas,它是python数据分析实践与实战的必备高级工具。对于使用 Python 进行数据分析来说,pandas 几乎是无人不知,无人不晓的。今天,我们就来认识认识数据分析界鼎鼎大名的 pandas。目录一. pandas主要数据结构 SeriesDataFrame二...

  • 效果演示:   实例代码:  

    JS document

    今天下雨