• doT.js模板引擎及基础原理


    个人bolg地址


    时至今日,基于后端JavaScript(Node.js)和MVC思想也开始流行起来。模板引擎是数据和页面分离工作中最重要的一环,在各大门户网站均有利用到模板引擎。

    模板引擎有很多种,但是原理了解也是非常必要的。

    什么是模板引擎,其根本原理就是将数据转换成“String”,再通过模板引擎抓取数据进行页面数据渲染。 

    看一个例子

    1 <script type="template" id="template">
    2     <h2>
    3       <a href="{{href}}">
    4         {{title}}
    5       </a>
    6     </h2>
    7     <img src="{{imgSrc}}" alt="{{title}}">
    8   </script>

    这样的方法类似Angular和Vue中双向数据绑定。 {{ XXXX }} 是需要进行替换的数据。

    var data = [
        {
          title: "我是标题1",
          href: "我是链接1",
          imgSrc: "我是图片1.jpg"
        },
        {
          title: "我是标题2",
          href: "我是链接2",
          imgSrc: "我是图片2.jpg"
        }
      ];

    可以通过replace和正则的方法进行替换导入。

    replace方法:

    template = document.querySelector('#template').innerHTML,
    result = document.querySelector('.result'),
    attachTemplateToData;
     
    // 将模板和数据作为参数,通过数据里所有的项将值替换到模板的标签上(注意不是遍历模板标签,因为标签可能不在数据里存在)。
    attachTemplateToData = function(template, data) {
            var i = 0,
                len = data.length,
                fragment = '';
     
            // 遍历数据集合里的每一个项,做相应的替换
            function replace(obj) {
                var t, key, reg;
           
           //遍历该数据项下所有的属性,将该属性作为key值来查找标签,然后替换
                for (key in obj) {
                    reg = new RegExp('{{' + key + '}}', 'ig');
                    t = (t || template).replace(reg, obj[key]);
                }
     
                return t;
            }
     
            for (; i < len; i++) {
                fragment += replace(data[i]);
            }
     
            return fragment;
        };
     
    result.innerHTML = attachTemplateToData(template, data);

    不用再次去特意设置变量名。  

    doT.js模板引擎

    1.   {{ = it.xxx }}  赋值

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>   <!-- = 赋值-->
    </head>
    <body>
        <div id="interpolation"></div>
        <script id="interpolationtmpl" type="text/x-dot-template">  <!--script的ID是为了被doT模板引擎抓取语法和模板 type必须为该类-->
            <div>Hi {{=it.name}}!</div>  <!--it在模板里为数据源 it.name 等同于 dataInter.name -->
            <div>{{=it.age || ''}}</div> <!-- = 为赋值,如果不存在改数据,||'' 为空 -->
        </script>
    </body>
    <script src="./doT.js"></script>
    <script src="./jquery.min.js"></script>
    
    <script>
    //定义数据源 var dataInter = {"name":"jake","age":31};
      // doT使用模板方法进行抓取script标签里的模板语法和布局
    var interText = doT.template($("#interpolationtmpl").text());
      // 将数据赋值给id对应的div进行渲染。 $(
    "#interpolation").html(interText(dataInter)); </script> </html>

    2.   {{ for }}  循环

       语法:  {{ for var KEY in DATA {  }}
                    {{= key }}
                    {{  }  }}

      

    <body>
        <div id="evaluation"></div>
        <script id="evaluationtmpl" type="text/x-dot-template">
        {{ for(var prop in it) { }}
            <div>KEY:{{= prop }}--------VALUE:{{= it[prop] }}</div><!--将值进行赋值循环-->
        {{ } }}
        </script>
    
    </body>
    <script src="./doT.js"></script>
    <script src="./jquery.min.js"></script>
    
    <script>
       var dataEval = {
    "name":"Jake",
    "age":31,
    "interests":["basketball","hockey","photography"],"contact":{"email":"122@123.com","phone":"999999999"}
    };
    var evalText = doT.template($("#evaluationtmpl").text()); $("#evaluation").html(evalText(dataEval)); </script>

    要注意 {{ for(var prop in it) { }}  ...  {{  } }}   为闭合标签,是为了让其中的模板进行输出,以及让{{ ... }} 的表达式进行执行。

    可能这种语法很多小伙伴们看不懂,但是 改变一下

     for(var prop in it) {       
            <div>KEY:{{= prop }}--------VALUE:{{= it[prop] }}</div> <!--将循环进行赋值-->
         } 

    把外面的花括号去掉了就能看懂了把。和上相比,只是将表达式都用双花括号包围起来,以便给doT模板引擎识别。
    {{ for(var prop in it) { }}
            <div>KEY:{{= prop }}--------VALUE:{{= it[prop] }}</div><!--将值进行赋值循环-->
        {{ } }}

    3.   {{~it.array:value:index}}  数组数据

     语法:
         {{~data.array :value:index }}
           ...
         

    <body>
        <div id="arrays"></div>
        <script id="arraystmpl" type="text/x-dot-template">
            {{~it.array:value:index}}  <-- ~ 为循环数组it.data -->
                <div>{{= index+1 }}{{= value}}</div>   <!--index为下标,初始值为0 ,可以进行计算-->
            {{~}}
        </script>
    </body>
    <script src="./doT.js"></script>
    <script src="./jquery.min.js"></script>
    
    <script>
       var dataArr = {"array":["banana","apple","orange"]};
       var arrText = doT.template($("#arraystmpl").text());
       $("#arrays").html(arrText(dataArr));
    </script>

     

    4.   {{ = it.xxx }}  赋值

     语法:

          {{? }} if
          {{?? }} else if
          {{??}} else

    <body>   
        <div id="condition"></div>
        <script id="conditionstmpl" type="text/x-dot-template">
    
            {{? !it.name }}<!--if有数据就跳过-->
                <div>Oh, I love your name, {{=it.name}}!</div>
            {{?? it.age === 1}}<!-- else if (age=31)执行此 -->
                <div>当前值为{{= it.age}}</div>
            {{?? !(it.age === 0)}}<!-- else if (age不为0)执行此 -->
                <div>Guess nobody named you yet!</div>
            {{?? !it.age == 0)}}<!-- 0本身为false  所有age为true 取反 -->
                <div>Guess nobody named you yet!</div>
            {{??}}
                 You are {{=it.age}} and still dont have a name?
            {{?}}
    
        </script>
    </body>
    <script src="./doT.js"></script>
    <script src="./jquery.min.js"></script>
    
    <script>
        var dataEncode = {"name":"yzw","age":1};
        var EncodeText = doT.template($("#conditionstmpl").text());
        $("#condition").html(EncodeText(dataEncode));
    </script>

    提示:!it.age  当age为0的时候为true,非0为false,但是进行数据恒等(===)的时候,

    如果想要将数据的结果进行取反,必须加个括号!(it.age === 0)  当age为0  ,为false  不等于!it.age === 0;

    模板引擎还是非常好用的,其余的{{for 插值 with encoding }}、{{##}}就不在本文叙述了,在使用过程中至今还未使用到。

  • 相关阅读:
    Linux并发与同步专题 (1)原子操作和内存屏障
    Linux并发与同步专题
    功耗案例分析:周期性底电流抬高问题分析和解决
    Android OpenGL 基础入门
    使用Codeblock搭建Windows下Objec-c学习环境
    Muduo 多线程模型对比
    NPTL 线程同步方式
    C++ 封装互斥对象
    Java 常用字符串操作总结
    Android 开发有用代码积累
  • 原文地址:https://www.cnblogs.com/yuanziwen/p/7608080.html
Copyright © 2020-2023  润新知