IT技术互动交流平台

artTemplate模板引擎学习实战

作者:Uncle-Keith  发布日期:2016-10-09 20:16:14

  在我的一篇关于智能搜索框异步加载数据的文章中,有博友给我留言,认为我手写字符串拼接效率过低,容易出错。在经过一段时间的摸索和学习之后,发现现在拼接字符串的方法都不在是自己去书写了,而是使用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'>
        <h3>{{title}}</h3>
        <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>

    

  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>

    

  2.3:嵌入子模板(include)

    嵌套模板跟第一种方法原理相同,只不过在一个模板中调用了另外一个模板而已。

     <script id='test' type='text/html'>
         <h3>My Life</h3>
         {{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>

    

3.artTemplate模板引擎使用实战

  artTemplate官网给出的每一个例子其实都已经很好了,可以让每一个人都很容易的明白。不过我认为唯一的缺点就是,例子中的数据完全都是自己定义的。在实际开发中,用户看到的每一个商品数据是这样来的:首先后端攻城狮通过特定语法连接数据库,然后将从数据库中获取的数据转换成JSON格式,最后前端攻城狮在通过一些方法将JSON数据渲染到页面上。所以我们的数据不能自己瞎造,而是通过Ajax异步加载。

  在我的一篇 淘宝购物车页面 智能搜索框Ajax异步加载数据 文章中,一开始是使用手写拼接字符串的方法去拼接字符串,这种方法效率低,容易出错。后来全部改成了js模板引擎的方法。所以我会以淘宝购物车页面中智能搜索框Ajax异步加载商品数据的例子来说明artTemplate模板引擎。

  先放上一段代码。主要还是想通过这个简单的例子说明接下来要探讨的问题。

     <script id='test' type='text/html'>
        <h3>{{title}}</h3>
        <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数据代码。

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

  上面代码中,是一段需要被Ajax异步加载数据的商品数据。

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

    <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'>¥<span>{{value.num}}.00</span></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'>
                                <span class='instr'>最多只能购买</span>
                                <span class='stockNum'></span><!--
                                --><em>件</em>
                            </div>

                            </li>
                        <li class='td-sum'>
                            <em>¥</em><!--
                            --><span>{{value.num}}</span>
                        </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对象 。

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" />

  

  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

  完。感谢大家的阅读。

Tag标签: 实战   模板   引擎  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规