经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
Handlebars.js 模板引擎
来源:cnblogs  作者:古道轻风  时间:2021/6/7 9:11:43  对本文有异议

介绍

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

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

基本语法

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

  1. <div class="demo">
  2. <h1>{{name}}</h1>
  3. <p>{{content}}</p>
  4. </div>

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

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

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

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

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

Handlebar的表达式

Block表达式

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

  1. <ul>
  2. {{#programme}}
  3. <li>{{language}}</li>
  4. {{/programme}}
  5. </ul>

有以下json数据

  1. {
  2. programme: [
  3. {language: "JavaScript"},
  4. {language: "HTML"},
  5. {language: "CSS"}
  6. ]
  7. }

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

  1. <ul>
  2. <li>JavaScript</li>
  3. <li>HTML</li>
  4. <li>CSS</li>
  5. </ul>

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

1.each block helper

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

  1. <ul>
  2. {{#each name}}
  3. <li>{{this}}</li>
  4. {{/each}}
  5. </ul>

对应适用的json数据

  1. {
  2. name: ["html","css","javascript"]
  3. };

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

2.if else block helper

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

  1. {{#if list}}
  2. <ul id="list">
  3. {{#each list}}
  4. <li>{{this}}</li>
  5. {{/each}}
  6. </ul>
  7. {{else}}
  8. <p>{{error}}</p>
  9. {{/if}}

对应适用json数据

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

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

3.unless block helper

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

  1. {{#unless data}}
  2. <ul id="list">
  3. {{#each list}}
  4. <li>{{this}}</li>
  5. {{/each}}
  6. </ul>
  7. {{else}}
  8. <p>{{error}}</p>
  9. {{/unless}}

4.with block helper

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

  1. <div class="entry">
  2. <h1>{{title}}</h1>
  3. {{#with author}}
  4. <h2>By {{firstName}} {{lastName}}</h2>
  5. {{/with}}
  6. </div>

对应适用json数据

  1. {
  2. title: "My first post!",
  3. author: {
  4. firstName: "Charles",
  5. lastName: "Jolley"
  6. }
  7. }

Handlebar的注释(comments)

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

  1. {{! handlebars comments }}

Handlebars的访问(Path)

Handlebar支持路径和mustache,Handlebar还支持嵌套的路径,使得能够查找嵌套低于当前上下文的属性
可以通过.来访问属性也可以使用../,来访问父级属性。 例如:(使用.访问的例子)

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

对应json数据

  1. {
  2. title: "My First Blog Post!",
  3. author: {
  4. id: 47,
  5. name: "Yehuda Katz"
  6. },
  7. body: "My first post. Wheeeee!"
  8. };

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

  1. {{#with person}}
  2. <h1>{{../company.name}}</h1>
  3. {{/with}}

对应适用json数据

  1. {
  2. "person":
  3. { "name": "Alan" },
  4. company:
  5. {"name": "Rad, Inc." }
  6. };

自定义helper

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

调试技巧

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

  1. Handlebars.registerHelper("debug", function(optionalValue) {
  2. console.log("Current Context");
  3. console.log("====================");
  4. console.log(this);
  5. if (optionalValue) {
  6. console.log("Value");
  7. console.log("====================");
  8. console.log(optionalValue);
  9. }
  10. });

handlebars的jquery插件

  1. (function($) {
  2. var compiled = {};
  3. $.fn.handlebars = function(template, data) {
  4. if (template instanceof jQuery) {
  5. template = $(template).html();
  6. }
  7. compiled[template] = Handlebars.compile(template);
  8. this.html(compiled[template](data));
  9. };
  10. })(jQuery);
  11. $('#content').handlebars($('#template'), { name: "Alan" });

 

 

Handlebars 中文文档 | Handlebars 中文网

原文链接:http://www.cnblogs.com/88223100/p/introducing-the-handlebars-js-templating-engine.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号