帖子
帖子
用户
博客
课程
显示全部楼层
11
帖子
0
勋章
73
Y币

doT的高级用法def编译时定义以及loadData的使用

[复制链接]
发表于 2019-8-1 21:16:13
本帖最后由 gp3098 于 2019-8-1 21:16 编辑

以前都是直接把模板写在页面底部的script标签内的,但是现在不一样了。
使用了doT.js配合api的loadData方法,整个页面就是模板了。
以前打开frame或者window的时候一直不明白url和data怎么配合,一直以为data只能加载到一些静态的页面,没有其他用法。

但是经过一段时间的学习之后,学习了doT.js的一些高级用法,感觉能够帮助我更好的搭建多页面程序。
1.在打开新页面的时候先通过dot渲染一个页面然后通过frame或者win的方法来加载html代码。上代码吧。
  1. //数据渲染到frame的内容区域//默认只渲染第一页
  2.         function renderData(currid, tag, page, size, sort, order) {

  3.                 var currentSort = $api.dom('.screen a.on');

  4.                 var param = {
  5.                         id: currid || tag.dataset.id,
  6.                         page: 1,
  7.                         size: 10,
  8.                         sort: sort || currentSort.dataset.sort,
  9.                         order: order || currentSort.dataset.order,
  10.                 }
  11.                 //从文件读取两个模板
  12.                 var template = loadfile('widget://mall/components/goodsList_frame.html');
  13.                 var template2 = loadfile('widget://mall/components/goodsitem.html');
  14.                 // var template = loadfile('widget://mall/components/goods.html');
  15.                 var def = {
  16.                         debug: true,
  17.                         content: template2, //第二个模板用于重复使用   在加载更多内容时候使用
  18.                         urlparam: param,
  19.                 };
  20.                 var tempFn = doT.template(template, undefined, def); //生成渲染模板的函数
  21.                 api.cancelAjax({
  22.                         tag: ajaxtag1
  23.                 });
  24.                 // console.warn(parseUrl(param));//用来解析url,把json的url变成字符串形式
  25.                 ajaxtag1 = $api.get(DOMAIN + '/ajax/goodslist?' + parseUrl(param), function(ret, err) {
  26.                         console.warn(JSON.stringify(ret));
  27.                         var html = tempFn(ret);
  28.                         // 要检查frame的真实内容在html这里!!!
  29.                         // console.warn(html);
  30.                         //通过loadData方式把页面加载到frame中,通过参数改变,每次重新加载frame内容
  31.                         api.loadData({
  32.                                 frameName: 'goods_list',
  33.                                 url: 'widget://mall/components/', //要加载的页面,data内的css、js的路径的根路径!!!
  34.                                 data: html //dot渲染出来的html页面  成为frame的内容,生成的frame页面整个页面都可以用dot模板语法因为整个页面就是模板
  35.                         });
  36.                 }, 'json');
  37.         }
复制代码
这里的loadfile是官方的api方法
有同步和异步两种,我都封装过,但是感觉封装的不够好,只展现一个同步的吧,不然感觉代码不完整。
  1. function loadfile(url) {
  2.     return api.readFile({
  3.         sync: true,
  4.         path: url || '',
  5.     });
  6. }
复制代码
还有官方的$api.get方法是不会返回tag用来取消ajax请求的,这段我也加工过了,具体就不献丑了。

  1. //json转url参数
  2. var parseUrl = function(urlparam) {
  3.     return Object.keys(urlparam).map(function(key) {
  4.         return encodeURIComponent(key) + "=" + encodeURIComponent(urlparam[key]);
  5.     }).join("&");

  6. }
复制代码
然后是模板文件

11
帖子
0
勋章
73
Y币
本帖最后由 gp3098 于 2019-8-1 21:22 编辑
  1. var template = loadfile('widget://mall/components/goodsList_frame.html');//对应的模板文件在下面
复制代码







  1. <!DOCTYPE html>
  2. <html lang="en">

  3. <head>
  4.         <meta charset="UTF-8">
  5.         <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  6.         <link rel="stylesheet" href="../css/all.css">
  7.         <title>商品二级分类  搜索 内容</title>
  8. </head>

  9. <body>
  10.         {{#def.header}}
  11.         <div class="product_list clearfix content" data-id="{{#def.urlparam.id}}" data-sort="{{#def.urlparam.sort}}" data-order="{{#def.urlparam.order}}" data-page="{{#def.urlparam.page}}" data-size="{{#def.urlparam.size}}">
  12.                 <!-- 这里的def.content预编译对应的在上一个页面的def内, -->
  13.                 <!-- 而content内的html我也单独提取出来放到一个页面内了,方便重复调用 -->
  14.                 {{#def.content }}
  15.         </div>
  16.         {{#def.footer}}
  17.         <!-- 这里只是说有这样的用法,但是不代表一定要加header或者footer,因为api框架的原因, -->
  18.         <!-- 我会在上一个页面内加载header也就是window里面,然后自适应高度头部 -->
  19.         <!-- 底部有时候是用tablayout写,所以也用不到 -->
  20.         
  21. </body>
  22. <script type="text/javascript" src="../js/doT.min.js"></script>
  23. <script type="text/javascript" src="../js/api.js"> </script>
  24. <script src="../js/main.js"></script>
  25. <script src="../js/goodsList_frame.js" charset="utf-8"></script>
  26. <!-- 加一个script标签用来放原生js也是可以的,但是为了防止dot模板冲突,建议还是放在文件里通过引用的方式来加载,css也是一样 -->
  27. </html>

复制代码

11
帖子
0
勋章
73
Y币
  1. {{?it.list && it.list.length>0}}
  2. {{~it.list:value:index}}
  3. <a href="javascript:;" onclick="openTabFrame(this);" data-id="{{=value.goods_id}}" data-userid="{{=value.user_id}}" data-name="{{=value.goods_name}}" data-saled="{{=value.sales_volume}}" data-price1="{{=value.market_price}}" data-price2="{{=value.shop_price}}"
  4.         data-thumb="{{=value.goods_thumb}}" data-stock="{{=value.goods_number}}" tapmode>
  5.         <img src="{{= DOMAIN + '/'+value.goods_thumb}}" alt="">
  6.         <h3>{{=value.goods_name}}</h3>
  7.         <h4>已卖出{{=value.sales_volume}}件</h4>
  8.         <p>¥{{=value.market_price}}<span>积分20%</span><span>满50元减5元</span></p>
  9. </a>
  10. {{~}}
  11. {{??}}
  12. {{?}}
复制代码
11
帖子
0
勋章
73
Y币
然后是template2的内容在3楼
11
帖子
0
勋章
73
Y币
如果有用过我的方法或者类似的方法请拿出来交流一下,互相学习
顺便如果有谁看出什么bug或者不完善的地方也请指点一二
30
帖子
0
勋章
242
Y币
还能这样玩啊
11
帖子
0
勋章
73
Y币

去试试吧,告诉我如何
380
帖子
4
勋章
6
Y币
不错
11
帖子
0
勋章
73
Y币
用这个方法还是会遇到问题的,比如在编译的时候选择加密,读取出来的模板文件会乱码,这时候要看模板文件的格式如果是html读取出来的是乱码,不过如果是其他格式就不会了。
您需要登录后才可以回帖 登录

本版积分规则