• 模板引擎


    模板引擎

    是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。

    为什么要使用模板引擎

    我们通过ajax获取到数据后,需要把数据渲染到页面,在学习模板引擎前,我们的做法是大量的拼接字符串,对于结构简单的页面,这么做还行,但是如果页面结构很复杂,使用拼串的话代码可阅读性非常的差,而且非常容易出错,后期代码维护也是相当的麻烦。

    【演示:使用拼串进行渲染的缺点.html】

    作用:代替前面渲染数据是拼接字符串操作

    实际工作渲染数据使用的模板引擎

     

    常见的模板引擎

    BaiduTemplate:http://tangram.baidu.com/BaiduTemplate/ velocity.js:https://github.com/shepherdwind/velocity.js/ ArtTemplate:https://github.com/aui/artTemplate

    artTemplate是使用最广泛,效率最高的模板引擎,需要大家掌握。

     

    artTemplate的使用

    github地址

    中文api地址

    artTemplate入门

    1.引入模板引擎的js文件

    <script src="template-web.js"></script>

    2.准备模板

    <!--
     指定了type为text/template后,这一段script标签并不会解析,也不会显示。
    -->
    <script type="text/template" id="tmp">
    <p>姓名:{{ username }}</p>  
    <p>年龄:{{ age }}</p>
    <p>技能:{{ skill }}</p>
    <p>描述:{{desc }}</p>
    </script>

    3.准备数据

    //3. 准备数据,数据是后台获取的,可以随时变化
    var json = {
     userName:"隔壁老王",
     age:18,
     skill:"查水表",
     desc:"年轻气壮"
    }

    4.将模板与数据进行绑定

    //第一个参数:模板的id
    //第二个参数:数据
    //返回值:根据模板生成的字符串。
    var html = template("myTmp", json);
    console.log(html);

    5.将数据显示到页面

    var div = document.querySelector("div");
    div.innerHTML = html;

    注意:传递给模板引擎的数据必须是对象

    artTemplate语法

    if语法

    {{if gender='男'}}
     <div class="man">
    {{else}}
     <div class="woman">
    {{/if}}

    each语法

    <!--
     1. {{each data}} 可以通过$value 和 $index获取值和下标
     2. {{each data v i}} 自己指定值为v,下标为i
    -->
    {{each data v i}}
    <li>
     <a href="{{v.url}}">
       <img src="{{v.src}}" alt="">
       <p>{{v.content}}</p>
      </a>
    </li>
    {{/each}}
    //如果返回的数据是个数组,必须使用对象进行包裹,因为在{{}}中只写书写对象的属性。
    var html = template("navTmp", {data:info});

     

    瀑布流案例

    封装jQuery瀑布流插件

    //特点分析:
    //1. 页面中每个图片模块使用绝对定位,所以每个图片的位置,都是动态计算出来的;
    //2. 每列直接会有间隙, 列数=容器的宽度/(一列的宽度+间隙)

    //思路分析:
    //1. 获取所有的图片模块,算出列数
    //2. 初始化一个数组,用户存储每一列的高度 [0,0,0,0,0]
    //3. 查找数组的最小列,每次都把图片定位到最小列的位置
    //4. 更新数组最小列的高度(加上定位过来的图片的高度)

     

    代码参考:

    //向jQuery的原型中添加方法 
    $.fn.waterFall=function(option){

       var data=option.gap||20;
     
       //1-获取页面中所有item 逐一进行定位
       var  items=$(this).children();
       // 获取第一个item的宽度 225
       var width=items.width();
       //列数
       var  count=Math.floor($(this).width()/(width+data.gap));

       //数组记录列高
       var column=[];

       //遍历给所有的 item进行定位
       // index 索引值,ele当前遍历元素
       items.each(function(index,ele){
           //第一行
           // top:0 left:index*(width+gap);
           if(index<count){ //第一行
               $(ele).css({
                   top:0,
                   left:index*(width+data.gap)
              })
               column[index]=$(ele).height()+data.gap; //更新列高
               // console.log(column);
          }else{
               //其他图片 一个一个找最小列高进行排列
               //先找最小列高
               var minHeight=column[0];
               var minKey=0;
               for(var i=0;i<column.length;i++){
                   if(column[i]<minHeight){
                       minHeight=column[i]; //记录列高最小值
                       minKey=i; //记录最小列索引
                  }
              }
               //设置当前图片的坐标
               $(ele).css({
                   top:minHeight, //最小列的列高
                   left:minKey*(width+data.gap) //最小列的索引值*(宽度+边距)
              })
               //更新列高
               column[minKey]+=$(ele).height()+data.gap;
          }
      })

       
       //求出所有列的最大值
       var maxHeight=column[0];
       for(var i=0;i<column.length;i++){
           if(column[i]>maxHeight){
               maxHeight=column[i];
          }
      }

       //设置items的高度
       $('.items').height(maxHeight);
    }

     

    瀑布流完整版

    //需求分析:
    //1. 页面刚开始,没有任何一张图片。因此需要从通过ajax获取第一屏的图片
    //2. 使用模版引擎将获取到的数据渲染到页面
    //3. 点击加载更多获取下一屏的数据
    //4. 给window注册scroll事件,当触底时,需要动态的加载图片。
    //5. 加载时,显示加载中的提示信息,并且要求不能重复发送ajax请求
    //6. 当服务端返回图片数量为0时,提示用户没有更多数据。

     

    接口文档

    接口地址: 
    ./data.php
    请求方式:
    post
    请求的参数:
    page:请求的页码  
    返回数据格式(json)
    page:下一页的页码
    items:返回的图片数据集合

     

     

    懦夫从未启程,弱者死在途中
  • 相关阅读:
    C++ XML解析之TinyXML篇[转]
    TinyXML:一个优秀的C++ XML解析器[转]
    nginx 出现413 Request Entity Too Large问题的解决方法
    redis配置认证密码
    《Discuz安装时候出现乱码 -- 问题解决方法》
    MySQL创建用户与授权
    CentOS 7 安装mysql
    setfacl命令 来自: http://man.linuxde.net/setfacl
    install pip3 for python 3.x
    自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书
  • 原文地址:https://www.cnblogs.com/oliviazhang/p/13567941.html
Copyright © 2020-2023  润新知