AjaxartTemplate模板引擎学习实战

  以自身之同一篇关于智能搜索框异步加载数据的文章被,有博友给自己留言,认为我手写字符串拼接效率过小,容易失误。在经过一段时间的摸和学后,发现本拼接字符串的方法还非以是温馨失去书写了,而是使用Javascript引擎。而javascript引擎的本来面目就是是赞助我们拿带有JavaScript代码的伪THTML语句编译为HTML。

 

  使有非了解之恋人,可以通往这点儿首文章:

  淘宝购物车页面
PC端和倒端实战

  淘宝购物车页面
智能搜索框Ajax异步加载数据

  源码地址:

  GitHub:Uncle-Keith

 

  回归正题,以下对artTemplate模板引擎的牵线会分成如下几组成部分情:

  1.artTemplate模板引擎的为主语法结构

  2.artTemplate模板引擎的主干采用方法

    2.1:使用一个type="text/html"script标签存放模板

    2.2:在javascript中存放模板

    2.3:嵌入子模板(include)

  3.artTemplate模板引擎使用实战

 

1.artTemplate着力语法结构

  artTemplate的语法结构很简短,就是{{}}。`{{}}“`
符号包裹起来的讲话则也模板的表达式。表达式又分为
输出表达式,条件表达式,遍历表达式,模板包含表达式。具体的得看GitHub:artTemplate
简洁语法版。官网对语法介绍的还好,不过当这边想以游说一样句子,要牢记表达式的写法与表达式有安分类,对于了解引擎很有帮衬。

 

2.artTemplate模板引擎的使方法

  首先,需要去官网下载
简短语法版,下一场于body底部加载script文件。文件充分有点,只发生2.7kb,可是功能特别有力。

*  *2.1:使用一个type="text/html"script标签存放模板

    采取script存放模板的时段要小心少个点。

    一方面是须让script标签定义id,而且只能是id,不能够是class。因为当动template(id,data)方法的当儿,该方法会根据id渲染模板,引擎内部会因document.getElementById(id)查找模板。如果采用class作为参数,artTemplate引擎会报错。如果无
data 参数,将回来一渲染函数。

    另外一头是以<!DOCTYPE
html>script标签中之type类型默看type/javascript。在script标签中,必须还声明type类型为text/html,否则会无力量。

    使用方法如下

     <script id="test" type="text/html">
        <h1>{{title}}</h1>
        <ul>
            {{each list as value i}}
                <li>索引{{i+1}} : {{value}}</li>
            {{/each}}
        </ul>
     </script>
     <script>
         var data = {
             title:'My Life',
             list:['篮球','桌球','游泳','滑轮','读书']
         };
         var html = template('test',data);
         $('.rascal').html(html);
     </script>

    渲染之页面如下:

    Ajax 1

  2.2:在Javascript中存放模板

    当Js中存放模板应该会非常少用到,因为以前端领域产生同一久军规,结构体制与行事三者必须分开。如果管模版放在js文件内,会坏就条规定。

    看看例子,知道一下调用的规则。实质上虽是一致段拼接字符串的进程。

     <script type="text/javascript">
         var source ="<ul>"
         + "{{each list as value i}}"
         + "<li>索引{{i+1}}:{{value}}</li>"
         + "{{/each}}"
         + "</ul>";

         var render = template.compile(source);
         var html = render({
             list:['篮球','桌球','游泳','滑轮','读书']
         });

         $('.rascal').html(html);
     </script>

    Ajax 2

  2.3:嵌入子模板(include)

    嵌套模板与第一栽方法原理同,只不过当一个模板被调用了另外一个模板而已。

     <script id='test' type='text/html'>
         <h1>My Life</h1>
         {{include 'list'}}
     </script>
     <script id='list' type='text/html'>
         <ul>
             {{each list as value i}}
                     <li>索引{{i+1}}:{{value}}</li>
             {{/each}}
         </ul>
     </script>
     <script>
         var data = {
             "list":['篮球','桌球','游泳','滑轮','读书']
         };
         var html = template('test',data);
         $('.rascal').html(html);
     </script>

    Ajax 3

3.artTemplate模板引擎使用实战

  artTemplate官网给闹的每一个事例其实都曾非常好了,可以给每一个口都深爱之领悟。不过自己道唯一的败笔就是是,例子中的数量了都是温馨定义之。在实际上开支中,用户观看的各级一个货物数量是这么来的:第一后端攻城狮通过特定语法连接数据库,然后拿于数据库中赢得的数额易成JSON格式,最后前端攻城狮在通过有法将JSON数据渲染到页面及。所以我们的多少未克团结瞎造,而是经Ajax异步加载。

  于自的等同篇 淘宝购物车页面
智能搜索框Ajax异步加载数据
文章中,一开始是下手写拼接字符串的艺术去拼接字符串,这种方式效率不如,容易失误。后来整个变动成为了js模板引擎的主意。所以我会以淘宝购物车页面中智能搜索框Ajax异步加载商品数量的事例来说明artTemplate模板引擎。

  先放开上同样段落代码。主要要想通过这个大概的例证说明接下要探索的问题。

     <script id="test" type="text/html">
        <h1>{{title}}</h1>
        <ul>
            {{each list as value i}}
                <li>索引{{i+1}} : {{value}}</li>
            {{/each}}
        </ul>
     </script>
     <script>
         var data = {
             title:'My Life',
             list:['篮球','桌球','游泳','滑轮','读书']
         };
         var html = template('test',data);
         $('.rascal').html(html);
     </script>

  上面代码中,要留心几点的便是:

  ♥
遍历表达式中之list必须同剧本中data对象被之list同名,而且遍历表达式中之list必须是data对象被之一个特性。循环表达式中,要循环的凡各级一个data对象吃之list数组,而无是data对象,这点异常重要。

  以这例子中,data对象中list属性是一个累组,数组中的诸一个价值都是粗略数据类型,篮球桌球等。当然,可以往数组中传入复杂数据列,如目标。说明是重点是以当循环表达式中循环的数额与于template()传入第二个参数的下特别易错。

  ♥ 使用template方法时,第一独参数必须是id,而非能够是class。

  

  放上一致截json数据代码。

Ajax 4Ajax 5

[
    [
        {
            "Query":"lan",
            "Results":[
                {
                    "Type":"AS",
                    "Suggests":[
                        {
                            "Txt":"李宁2016新款男子篮球鞋音速3高帮反弹篮球场地鞋ABAL031",
                            "num":339,
                            "max":764,
                            "discount":200,
                            "label":"liningBas",
                            "shop":"李宁官方网店",
                            "image":"csslining-bas.png",
                            "color":"颜色分类:荧光果粉/木梅红",
                            "size":"鞋码:42",
                            "nonDiscount":"¥539.00",
                            "bandCard":"cssnkCard.png",
                            "sevenDay":"csssevenDay.png",
                            "guarantee":"cssguarantee.png"
                        },
                        {
                            "Txt":" adidas阿迪达斯篮球男子篮球鞋Regulate",
                            "num":419,
                            "max":18,
                            "discount":120,
                            "label":"adidas",
                            "nonDiscount":"¥539.00",
                            "image":"cssidas.png",
                            "color":"颜色分类:银金属/深藏青蓝",
                            "shop":"adidas官方旗舰店",
                            "size":"鞋码:43.5",
                            "bandCard":"cssnkCard.png",
                            "sevenDay":"csssevenDay.png",
                            "guarantee":"cssguarantee.png"
                        }
                    ]
                }
            ]
        }
    ],
    [
        {
            "Query":"音速3",
            "Results":[
                {
                    "Type":"AS",
                    "Suggests":[
                        {
                            "Txt":"李宁2016新款男子篮球鞋音速3高帮反弹篮球场地鞋ABAL031",
                            "num":339,
                            "max":764,
                            "label":"liningBas",
                            "shop":"李宁官方网店",
                            "image":"csslining-bas.png",
                            "color":"颜色分类:荧光果粉/木梅红",
                            "size":"鞋码:42",
                            "nonDiscount":"¥539.00",
                            "bandCard":"cssnkCard.png",
                            "sevenDay":"csssevenDay.png",
                            "guarantee":"cssguarantee.png"
                        }
                    ]
                }
            ]
        }
    ]
]

basketBallShoes.json

  上面代码中,是一律段落需让Ajax异步加载数据的货色数。

  再放上使用一个type="text/html"script签存放模板的代码。

Ajax 6Ajax 7

    <script id='basketBallShoes' type="text/html">
        {{each Suggests as value i}}
            <div class="mainCommodity">
                <div class="shopInfo">
                    <div class="shopMsg">
                            <input type="checkbox" name="shopMsg" id='{{value.label}}' class='shopMsg-input' autocomplete="off">
                            <label for="{{value.label}}">店铺:
                        <a href="#">{{value.shop}}</a>
                    </div>
                </div>
                <div class="commodityInfo">
                    <ul>
                        <li class='td-chk'>
                            <div class="td-inner">
                                <input type="checkbox" name='checkbox' autocomplete="off" >
                            </div>
                        </li>
                        <li class='td-item'>
                            <div class="td-inner">
                                <a href="#" class='desImg'>
                                    <img src="{{value.image}}" alt='{{value.Txt}}'>
                                </a>
                                <div class="item-info">
                                    <div class="item-basis-info">
                                        <a href="#">{{value.Txt}}</a>
                                    </div>
                                    <div class="item-other-info">
                                        <div class="item-other-space"></div>
                                        <div class="item-other-list">
                                            <a href="#" title='支持信用卡支付'>
                                                <img src="{{value.bandCard}}" alt="支持信用卡支付">
                                            </a>
                                            <a href="#" class='sevenDay' title='7天无理由'>
                                                <img src="{{value.sevenDay}}" alt="7天无理由">
                                            </a>
                                            <a href="#" title='消费者保障服务'>
                                                <img src="{{value.guarantee}}" alt="消费者保障服务">
                                            </a>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </li>
                        <li class='td-info'>
                            <div class="td-info-msg">
                                <p>{{value.color}}</p>
                                <p>{{value.size}}</p>
                            </div>
                        </li>
                        <li class='td-price'>
                            <div class="td-inner">
                                <p class='non-discount'>{{value.nonDiscount}}</p>
                                <p class='discount'>¥{{value.num}}.00</p>
                                <div class="promotion">
                                    卖家促销
                                    <i class='promotionIcon'></i>
                                </div>
                                <div class="proSlidedown">
                                    <p class='newPro'>卖家促销:新品大特价</p>
                                    <p>优惠:¥200.00</p>
                                </div>
                            </div>
                        </li>
                        <li class='td-amount'>
                            <div class="item-amount">
                                <a href="#" class='amount-left amount-color'>-</a>
                                <input type="text" name='amountNum' value='1' autocomplete="off">
                                <a href="#" class="amount-right">+</a>
                            </div>
                            <div class="stock">
                                {{value.max}}
                            </div>
                            <div class="outNum">
                                最多只能购买
                                <!--
                                --><em>件</em>
                            </div>

                            </li>
                        <li class='td-sum'>
                            <em>¥</em><!--
                            -->{{value.num}}
                        </li>
                        <li class='td-operation'>
                            <p><a href="#" class='delete'>删除</a></p>
                        </li>
                    </ul>
                </div>
            </div>
        {{/each}}
    </script>
    <script id="search" type="text/html">
        <ul>
            {{each Suggests as value i}}
                <li>{{value.Txt}}</li>
            {{/each}}
        </ul>
    </script>
    <script id='delete' type='text/html'>
        <div class="undo-wrapper">
            <div class="deleteCom">
                <p>
                    成功删除
                    <em>1</em>
                    件宝贝,如果有无,可
                    <a href="#" class='turnBack'>撤销本次删除</a>
                </p>
            </div>
        </div>
    </script>

JS模板引擎

  上面代码中凡急需被渲染之模板。比手写拼接字符串简单好多,并且效率高,错误率低。

  最后放上js实现相应功能的有些重大代码。

$.get('search.json',{'Query':$val}, function(data) {
    for (var i = 0; i < data.length; i++) {
        //如果值与json中的query字段匹配,动态加载html
        if ($val === data[i][0].Query) {
        var results = data[i][0].Results[0];
        //js模板引擎
        var $html = template('search',results);
        $('.list').html($html)
        }
    }
});

  这里想说的凡受template方法的亚个参数与循环表达式需要让循环的字段。

  第一沾是受template方法的第二单参数。第二独参数传入了results,这里的results实质上虽是当上头例子中data对象。只不过当JSON数码中results是一个数组。

  第二沾是以JS模板引擎中。在模板被是这般写的:{{each
Suggests as value
i}},这里的Suggests其实就算相当给data对象中的list属性。在data对象被,list是一个频组,并且每个值都是字符串;而在results数组被,Suggests是一个屡屡组,不过它的各级一个价值都是错综复杂数据类,是目标。如果对数据类型不明白的,可以往这首文章:Javascript对象

Ajax 8

  

  artTemplate用实战就介绍完了。在template方法的亚独参数与遍历表达式中待给遍历的数目好轻写错,希望同学可以小心这一点。

  如果发生无亮堂要写错的地方,可以被自己留言。

 

  参考文章

  artTemplate

  atc-前端模板预编译器

  赛性能JavaScript模板引擎原理分析

  无限简便的JavaScript模板引擎

  简易JavaScript模版引擎优化

  javascript模板引擎原理,几行代码的事务

  老伯手记(7):构建友好的JavaScript模板小引擎

  基于HTML模板和JSON数据的JavaScript交互

 

  源码地址:GitHub:Uncle-Keith

  转载请注明出处:http://www.cnblogs.com/Uncle-Keith/p/5932439.html

 

  完。感谢大家之翻阅。

相关文章