Handlebars.js循环中索引(@index)使用技巧(访问父级索引)

使用Handlebars.js过程中,难免会使用循环,比如构造数据表格。而使用循环,又经常会用到索引,也就是获取当前循环到第几次了,一般会以这个为序号显示在页面上。

Handlebars.js中获取循环索引很简单,只需在循环中使用{{@index}}即可。

 1 <!DOCTYPE html>
 2 <html>
 3   <head>
 4     <META http-equiv=Content-Type content="text/html; charset=utf-8">
 5     <title>Handlebars.js循环中索引(@index)使用技巧 - by 杨元</title>
 6   </head>
 7   <body>
 8     <h1>Handlebars.js循环中索引(@index)使用技巧</h1>
 9     <!--基础html框架-->
10     <table>
11       <thead>
12         <tr>
13           <th></th>
14           <th>姓名</th>
15           <th>性别</th>
16           <th>年龄</th>
17         </tr>
18       </thead>
19       <tbody id="tableList">
20
21       </tbody>
22     </table>
23
24     <!--插件引用-->
25     <script type="text/javascript" src="script/jquery.js"></script>
26     <script type="text/javascript" src="script/handlebars-v1.3.0.js"></script>
27
28     <!--Handlebars.js模版-->
29     <!--Handlebars.js模版放在script标签中,保留了html原有层次结构,模版中要写一些操作语句-->
30     <!--id可以用来唯一确定一个模版,type是模版固定的写法-->
31     <script id="table-template" type="text/x-handlebars-template">
32       {{#each this}}
33         <tr>
34           <td>{{@index}}.</td>
35           <td>{{name}}</td>
36           <td>{{sex}}</td>
37           <td>{{age}}</td>
38         </tr>
39       {{/each}}
40     </script>
41
42     <!--进行数据处理、html构造-->
43     <script type="text/javascript">
44       var data = [{
45         name: "张三",
46         sex: "男",
47         age: 35
48       },{
49         name: "李四",
50         sex: "男",
51         age: 23
52       },{
53         name: "甜妞",
54         sex: "女",
55         age: 18
56       }];
57
58       //解析模版
59       var handle = Handlebars.compile($("#table-template").html());
60       //生成html
61       var html = handle(data);
62       //插入到页面
63       $("#tableList").append(html);
64
65     </script>
66   </body>
67 </html>

虽然用{{@index}}可以获取到索引,但遗憾的是,索引是从0开始的。。。这样让人看起来很不舒服。因此,我们可以使用一个Helper来让索引+1,变成从1开始。

 1 <!DOCTYPE html>
 2 <html>
 3   <head>
 4     <META http-equiv=Content-Type content="text/html; charset=utf-8">
 5     <title>Handlebars.js循环中索引(@index)使用技巧 - by 杨元</title>
 6   </head>
 7   <body>
 8     <h1>Handlebars.js循环中索引(@index)使用技巧</h1>
 9     <!--基础html框架-->
10     <table>
11       <thead>
12         <tr>
13           <th></th>
14           <th>姓名</th>
15           <th>性别</th>
16           <th>年龄</th>
17         </tr>
18       </thead>
19       <tbody id="tableList">
20
21       </tbody>
22     </table>
23
24     <!--插件引用-->
25     <script type="text/javascript" src="script/jquery.js"></script>
26     <script type="text/javascript" src="script/handlebars-v1.3.0.js"></script>
27
28     <!--Handlebars.js模版-->
29     <!--Handlebars.js模版放在script标签中,保留了html原有层次结构,模版中要写一些操作语句-->
30     <!--id可以用来唯一确定一个模版,type是模版固定的写法-->
31     <script id="table-template" type="text/x-handlebars-template">
32       {{#each this}}
33         <tr>
34           <td>{{addOne @index}}.</td>
35           <td>{{name}}</td>
36           <td>{{sex}}</td>
37           <td>{{age}}</td>
38         </tr>
39       {{/each}}
40     </script>
41
42     <!--进行数据处理、html构造-->
43     <script type="text/javascript">
44       var data = [{
45         name: "张三",
46         sex: "男",
47         age: 35
48       },{
49         name: "李四",
50         sex: "男",
51         age: 23
52       },{
53         name: "甜妞",
54         sex: "女",
55         age: 18
56       }];
57
58       //注册索引+1的helper
59       var handleHelper = Handlebars.registerHelper("addOne",function(index){
60         //返回+1之后的结果
61         return index+1;
62       });
63       //解析模版
64       var handle = Handlebars.compile($("#table-template").html());
65       //生成html
66       var html = handle(data);
67       //插入到页面
68       $("#tableList").append(html);
69
70     </script>
71   </body>
72 </html>

不要以为这就完事了,这只是一般情况,小菜还要介绍一个非常特殊的场景。

假如循环中套了一个循环,在内层循环中如何获取外层循环的索引呢?

我们已经知道,可以用类似{{../name}}这种语法访问父级循环中的属性,但是这样访问父级索引是不可以的,例如:{{../@index}},这样写是不正确的。

我们可以通过一个小手段来获取。

写例子之前,小菜多废话几句,其实这个非常实用,可以创建分级的索引,比如1.1、1.2等,也可以用作特殊的标识,理解成分组。

  1 <!DOCTYPE html>
  2 <html>
  3   <head>
  4     <META http-equiv=Content-Type content="text/html; charset=utf-8">
  5     <title>Handlebars.js循环中索引(@index)使用技巧 - by 杨元</title>
  6   </head>
  7   <body>
  8     <h1>Handlebars.js循环中索引(@index)使用技巧</h1>
  9     <!--基础html框架-->
 10     <table>
 11       <thead>
 12         <tr>
 13           <th></th>
 14           <th>姓名</th>
 15           <th>性别</th>
 16           <th>年龄</th>
 17         </tr>
 18       </thead>
 19       <tbody id="tableList">
 20
 21       </tbody>
 22     </table>
 23
 24     <!--插件引用-->
 25     <script type="text/javascript" src="script/jquery.js"></script>
 26     <script type="text/javascript" src="script/handlebars-v1.3.0.js"></script>
 27
 28     <!--Handlebars.js模版-->
 29     <!--Handlebars.js模版放在script标签中,保留了html原有层次结构,模版中要写一些操作语句-->
 30     <!--id可以用来唯一确定一个模版,type是模版固定的写法-->
 31     <script id="table-template" type="text/x-handlebars-template">
 32       {{#each this}}
 33         <tr>
 34           <td>{{addOne @index}}</td>
 35           <td>{{name}}</td>
 36           <td>{{sex}}</td>
 37           <td>{{age}}</td>
 38         </tr>
 39         {{#each family}}
 40           <tr>
 41             <td>{{../_index}}.{{@index}}</td>
 42             <td>{{name}}</td>
 43             <td>{{sex}}</td>
 44             <td>{{age}}</td>
 45           </tr>
 46         {{/each}}
 47       {{/each}}
 48     </script>
 49
 50     <!--进行数据处理、html构造-->
 51     <script type="text/javascript">
 52       var data = [{
 53         name: "张三",
 54         sex: "男",
 55         age: 35,
 56         family: [{
 57           name: "张三儿子",
 58           sex: "男",
 59           age: 10,
 60         },{
 61           name: "张三妻子",
 62           sex: "女",
 63           age: 33,
 64         }]
 65       },{
 66         name: "李四",
 67         sex: "男",
 68         age: 23,
 69         family: [{
 70           name: "李四妻子",
 71           sex: "女",
 72           age: 23,
 73         }]
 74       },{
 75         name: "甜妞",
 76         sex: "女",
 77         age: 18,
 78         family: [{
 79           name: "甜妞妈妈",
 80           sex: "女",
 81           age: 40,
 82         },{
 83           name: "甜妞爸爸",
 84           sex: "男",
 85           age: 43,
 86         },{
 87           name: "甜妞姥爷",
 88           sex: "男",
 89           age: 73,
 90         }]
 91       }];
 92
 93       //注册索引+1的helper
 94       var handleHelper = Handlebars.registerHelper("addOne",function(index){
 95         //利用+1的时机,在父级循环对象中添加一个_index属性,用来保存父级每次循环的索引
 96         this._index = index+1;
 97         //返回+1之后的结果
 98         return this._index;
 99       });
100       //解析模版
101       var handle = Handlebars.compile($("#table-template").html());
102       //生成html
103       var html = handle(data);
104       //插入到页面
105       $("#tableList").append(html);
106
107     </script>
108   </body>
109 </html>

分享到此结束~~~祝读者学习愉快~~

Handlebars.js循环中索引(@index)使用技巧(访问父级索引),布布扣,bubuko.com

时间: 2024-10-26 20:07:40

Handlebars.js循环中索引(@index)使用技巧(访问父级索引)的相关文章

彻底弄懂js循环中的闭包问题

第一次接触这个问题还是在我刚开始学js的时候,当时就是一头雾水,时隔一年多了,突然又想起了这个问题,在这个春气盎然的周末,我就坐下来研究下并把结果和大家分享下: 先看代码:demo.html<!DOCTYPE HTML> <html>  <head>   <meta charset="gbk"/>   <title>闭包循环问题</title>   <style type="text/css&quo

JsRender实用教程(tag else使用、循环嵌套访问父级数据)

前言: 正在做angularJs的分页功能时,发现了JsRender这个插件,园子里的大神多,查到一个用JsRender实现的分页demo,地址是这个 http://www.cnblogs.com/sword-successful/p/4759027.html#3379766 查了一下相关的基本资料 下面是引自http://www.ziliao1.com/article/show/0c5ac83aeac0a1fc6af388817c52b6c0.html JsRender是一款基于jQuery的

knockout 无容器绑定,多重foreach,获取当前 索引 父级索引

在使用knockout过程中 发现jquery tmpl  在循环上性能很差.经过多方查询得知 knockout 其实有 自己的 无容器绑定. 那么废话少说现在开始. 1.后台模型展示 为了构建更生动的数据源我们先声明一个类,起名叫 User 这个类的接口一眼就看穿了,需要注意的地方就是 每个User 都有一个 UserFriends的集合. using System; using System.Collections.Generic; using System.Linq; using Syst

ThinkPHP 关联模型中查询某条记录的父级(非查询子级)

数据表 id      cat_name      cat_pid 76     手机.数码     0 84     手机配件        76 86     蓝牙耳机        84 从属关系 : 蓝牙耳机  =>(上一级)  手机配件   =>(上一级)  手机.数码(顶级了) 关联模型 namespace Admin\Model; use Think\Model\RelationModel; class CategoryModel extends RelationModel {

用闭包解决 js 循环中函数变量暂存问题

需求:有一个数组,根据数组的值渲染对应的数字div,单击对应的div 在控制台打印对应的数字.如点击1,控制台打印1. 问题: 不管点击哪个值 打出来都是4 代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>testFor</title> </head> <body> &l

JS开发中常用的小技巧

1.获取指定范围内的随机数 function getRadomNum(min,max){ return Math.floor(Math.random() * (max - min + 1)) + min; } 2.随机获取数组中的元素 function getRadomFromArr(arr){ return arr[Math.floor(Math.random()*arr.length)]; } 3.生成从0到指定值的数字数组 function getArray(len) { var arr

JS开发中的一些小技巧和方法

生成指定范围内的随机数 当我们需要获取指定范围(min,max)内的整数的时候,下面的代码非常适合:这段代码用的还挺多的. function setRadomNum(min,max){ return Math.floor(Math.random() * (max - min + 1)) + min; } json转url参数 当我们进行http请求时,可能需要把json转化为url参数,这时下面这段代码就派上用场了. function json2url(json) { var arr=[]; f

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比. JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素. <div id="test"> <div></div> <div></div> </div> 原生的J

js模版引擎handlebars.js实用教程

一.为什么选择Handlebars.js 据小菜了解,对于java开发,涉及到页面展示时,比较主流的有两种解决方案: 1. struts2+vo+el表达式. 这种方式,重点不在于struts2,而是vo和el表达式,其基本思想是:根据页面需要的信息,构造出一个实体,这个实体中包含了界面需要的所有属性,通常这个实体是由N个表中的字段构成的,俗称vo.由于vo的属性可以是String.List.Map等等等,又可以vo套vo,因此这种方式非常灵活,也非常好用. 在后台对vo进行赋值,通过strut