让我明白又糊涂的handlebars(二)

6月25日,寻游json挖下的坑


心中潜藏的固执终于爆发,因为开始于杨元的博客,固执于每一次渲染开始于循环、结束于循环。进入了一个关于json格式的死循环,还不愿意醒,重复自己模拟json、取json,但是就是不愿意在自己得到的json中去直接查找直接渲染。真是执着于一个不怎么好的实现,还沾沾自喜,认为自己发现了无人的小角落,殊不知是一个路旁的可见底的涵洞,探之无味。

handlebars函数方法


前一章对handlebars使用的一些思想进行了介绍,这里是承接它对handlebars的使用进行一些补充,不能保证全面,但是我会坚持不断发现,不断补充,完善handlebars的使用。

  • handlebars大的使用前奏-三点
  1. 引用库
<script src="jquery/jquery.js"></script>
<script src="handlebars/handlebars-v3.0.1.js"></script>
  1. 页面数据渲染与实现
<script id ="table-template" type="text/x-handlebars-template">
{{data}}
</script>
  1. 相应js获取json并渲染(一般使用ajax)
 <script src="handle.js"></script>
var data = {"data":"data"};
var myTemplate = Handlebars.compile($("#table-template").html());
$('body').html(myTemplate(data));
//这里利用jquery实现对handlebars的编译与页面的实现
var source = "<p>Hello, my name is {{name}}. I am from {{hometown}}. I have " + 
"{{kids.length}} kids:</p>" + 
"<ul>{{#kids}}<li>{{name}} is {{age}}</li>{{/kids}}</ul>"; 
var template = Handlebars.compile(source); 
var data = { "name": "Alan", "hometown": "Somewhere, TX", 
"kids": [{"name": "Jimmy", "age": "12"}, {"name": "Sally", "age": "4"}]}; 
var result = template(data);
  • handlebars正式使用的语句
  1. 注释
    不能使用其他的注释方法:// /**/等,在handlebars都会报错,只能用
{{! 这是一个注释}}
{{!-- 一起消失吧--}}
  1. handlebars表达式
    很多时候,我们只需要从后台获取数据,然后将数据放在对应页面中,那么就会存在循环、判断等情况,但是通过前面的直接进入数据是不行的,所以我们就有了Block表达式,对某些事情进行更深入的操作。
    一般形式为:{{# blockdemo}}开始到{{/blockdemo}}结束。通过一些逻辑操作来进行block的定义与使用。
  2. handlebars的内置块表达式(Block helper)
  • each block helper === 即循环,遍历出列表内容,用this来引用遍历的元素
<ul> 
     {{#each name}} 
     <li>{{this}}</li> 
     {{/each}}
</ul> 

对应的json

    { name: ["html","css","javascript"]};
  • if else block helper == 即if/else语句
    使用{{#if}}、{{#else}} {{/if}}等进行渲染,如:
{{#if list}}
<ul id="list">
     {{#each list}} 
    <li>{{this}}</li>
     {{/each}}
</ul> 
{{else}} 
   <p>{{error}}</p>
{{/if}}
var data = {
           info:['HTML5','CSS3',"WebGL"], 
           "error":"数据取出错误"
}
  • unless block helper== 与if相反使用即可,如:
{{#unless data}}
<ul id="list"> 
    {{#each list}} 
      <li>{{this}}</li>
     {{/each}}
</ul>
 {{else}} 
    <p>{{error}}</p>
{{/unless}}
  • with block helper == 会在编译的阶段的时候进行context传递和赋值,用with我们可以很简单的进入一个数据集合里面,查找对应的数据很方便,如:
<div class="entry">
     <h1>{{title}}</h1> 
      {{#with author}}
      <h2>By {{firstName}} {{lastName}}</h2>  
       {{/with}}
  </div> 
{ 
  title: "My first post!",
  author: {
     firstName: "Charles",
     lastName: "Jolley"
     }
}
  1. handlebars自定义标签
    handlebars的自定义标签可以使用在Handlebars模板的任何地方,必须使用Handlebars.registerHelper即注册helper,用一个简单的例子来讲解:
Handlebars.registerHelper('fullName', function(person) {
 return person.firstName + " " + person.lastName;});

使用情景:

<div class="post"> 
    <h1>By {{fullName author}}</h1>
     <div class="body">{{body}}</div> 
    <h1>Comments</h1> 
   {{#each comments}} 
   <h2>By {{fullName author}}</h2>
   <div class="body">{{body}}</div> 
    {{/each}}
</div>

数据:

var context = { 
    author: {
            firstName: "Alan", 
            lastName: "Johnson"}, 
            body: "I Love Handlebars", 
            comments: [{ 
                author: {
                       firstName: "Yehuda", 
                       lastName: "Katz"}, 
                        body: "Me too!" 
                }
     ]};

结果:

<div class="post"> 
      <h1>By Alan Johnson</h1> 
      <div class="body">I Love Handlebars</div> 
      <h1>Comments</h1> 
      <h2>By Yehuda Katz</h2> 
      <div class="body">Me Too!</div>
</div>

注:在自定义标签的helper中可以使用this,this是当前的对象。

  1. handlebars访问路径(Path)
    handlebars支持路径,可以使用嵌套的路径,能够查找嵌套低于当前上下文的属性:
.    访问属性
../  访问父属性

如:

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

访问情况

<h1>{{author.id}}</h1> 
 {{#with author}} 
 <h1>{{../title}}</h1>
 {{/with}}
  1. 其他注意点
  • {{}}与{{{}}},{{}}会将所有的内容解析并转义,{{{}}}不会对html内容进行操作,这样我们需要的html就可以保全,但是必须保证html中无""(改成 ' '),还有不能有换行等,这样会报错
  • 还有与volicity有一个冲突的过程,需要注意。
    这就是我要说的详细内容,缺少请指正,以便及时更新,及时补充。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • http://segmentfault.com/a/1190000000342636?from=androidqq...
    江火渔枫阅读 9,013评论 1 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 本文是对 MagicalRecord github上的翻译 正文:注意: MagicalRecord 在 ARC...
    騂跃神话阅读 1,993评论 1 5
  • 妈,即便不是生身母,却捡回了自己的命,莲子怀着感恩的心情思忖着。作为一个毫不相干的没有血缘的人,将自己视如己出,养...
    梦谷阅读 202评论 0 1
  • 这个世界上,太多的事情无法定义。但假如你不是真的爱我,就不要装作懂我的样子接近我。 1 假如你不懂我 请不要对我说...
    我吃西兰花阅读 845评论 9 11