本文出自APICloud官方论坛,

感谢论坛版主 gp3098的分享。

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

学习了doT.js的一些高级用法,能够更好的搭建多页面程序。

在打开新页面的时候先通过dot渲染一个页面然后通过frame或者win的方法来加载html代码。

//数据渲染到frame的内容区域//默认只渲染第一页

function renderData(currid, tag, page, size, sort, order) {

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

var param = {

id: currid || tag.dataset.id,

page: 1,

size: 10,

sort: sort || currentSort.dataset.sort,

order: order || currentSort.dataset.order,

}

//从文件读取两个模板

var template = loadfile('widget://mall/components/goodsList_frame.html');

var template2 = loadfile('widget://mall/components/goodsitem.html');

// var template = loadfile('widget://mall/components/goods.html');

var def = {

debug: true,

content: template2, //第二个模板用于重复使用   在加载更多内容时候使用

urlparam: param,

};

var tempFn = doT.template(template, undefined, def); //生成渲染模板的函数

api.cancelAjax({

tag: ajaxtag1

});

// console.warn(parseUrl(param));//用来解析url,把jsonurl变成字符串形式

ajaxtag1 = $api.get(DOMAIN + '/ajax/goodslist?' + parseUrl(param), function(ret, err) {

console.warn(JSON.stringify(ret));

var html = tempFn(ret);

// 要检查frame的真实内容在html这里!!!

// console.warn(html);

//通过loadData方式把页面加载到frame中,通过参数改变,每次重新加载frame内容

api.loadData({

frameName: 'goods_list',

url: 'widget://mall/components/', //要加载的页面,data内的cssjs的路径的根路径!!!

data: html //dot渲染出来的html页面  成为frame的内容,生成的frame页面整个页面都可以用dot模板语法因为整个页面就是模板

});

}, 'json');

}

复制代码

这里的loadfile是官方的api方法

有同步和异步两种,都进行封装过,但感觉封装得不够好,只展现一个同步,不然代码不完整。

function loadfile(url) {

return api.readFile({

sync: true,

path: url || '',

});

}

复制代码

还有官方的$api.get方法是不会返回tag用来取消ajax请求的

//jsonurl参数

var parseUrl = function(urlparam) {

return Object.keys(urlparam).map(function(key) {

return encodeURIComponent(key) + "=" + encodeURIComponent(urlparam[key]);

}).join("&");

}

复制代码

模板1

var template = loadfile('widget://mall/components/goodsList_frame.html');//对应的模板文件在下面

复制代码

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">

<link rel="stylesheet" href="../css/all.css">

<title>商品二级分类  搜索 内容</title>

</head>

<body>

{{#def.header}}

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

<!-- 这里的def.content预编译对应的在上一个页面的def内, -->

<!-- content内的html我也单独提取出来放到一个页面内了,方便重复调用 -->

{{#def.content }}

</div>

{{#def.footer}}

<!-- 这里只是说有这样的用法,但是不代表一定要加header或者footer,因为api框架的原因, -->

<!-- 我会在上一个页面内加载header也就是window里面,然后自适应高度头部 -->

<!-- 底部有时候是用tablayout写,所以也用不到 -->

</body>

<script type="text/javascript" src="../js/doT.min.js"></script>

<script type="text/javascript" src="../js/api.js"> </script>

<script src="../js/main.js"></script>

<script src="../js/goodsList_frame.js" charset="utf-8"></script>

<!-- 加一个script标签用来放原生js也是可以的,但是为了防止dot模板冲突,建议还是放在文件里通过引用的方式来加载,css也是一样 -->

</html>

复制代码

模板 2

{{?it.list && it.list.length>0}}

{{~it.list:value:index}}

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

data-thumb="{{=value.goods_thumb}}" data-stock="{{=value.goods_number}}" tapmode>

<img src="{{= DOMAIN + '/'+value.goods_thumb}}" alt="">

<h3>{{=value.goods_name}}</h3>

<h4>已卖出{{=value.sales_volume}}件</h4>

<p>¥{{=value.market_price}}<span>积分20%</span><span>满50元减5元</span></p>

</a>

{{~}}

{{??}}

{{?}}

复制代码

doT的高级用法及loadData的使用的更多相关文章

  1. Go template高级用法、深入详解、手册、指南、剖析

    入门示例 以下为test.html文件的内容,里面使用了一个template语法{{.}}. <!DOCTYPE html> <html> <head> <m ...

  2. Visual Studio 宏的高级用法

    因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...

  3. SolrNet高级用法(分页、Facet查询、任意分组)

    前言 如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单.导航分类(比如电脑.PC的话会有 ...

  4. sqlalchemy(二)高级用法

    sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...

  5. Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)

    上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了.没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的 ...

  6. 再谈Newtonsoft.Json高级用法

    上一篇Newtonsoft.Json高级用法发布以后收到挺多回复的,本篇将分享几点挺有用的知识点和最近项目中用到的一个新点进行说明,做为对上篇文章的补充. 阅读目录 动态改变属性序列化名称 枚举值序列 ...

  7. Jquery remove 高级用法

    Jquery remove 高级用法 html 代码 <div class="file-image">abc1111</div><div class= ...

  8. Newtonsoft.Json高级用法(转)

    手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数 ...

  9. redis(二)高级用法

    redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来 ...

随机推荐

  1. Laravel 5.* 执行seeder命令出现错误的解决方法

    最近在使用Laravel开发一个项目,测试中需要增加数据库基础数据动作,当第一次执行完`php artisan db:seed` 后,增加新的seeder文件时执行会报错.错误信息如下`[Reflec ...

  2. 关于 vue 生命周期 钩子函数 事件

    vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染->更新->渲染.卸载等一系列过程,我们称这是vue的生命周期. 通俗的将就是vue实例从创建到销毁 ...

  3. dotnet core 发布只有一个 exe 的方法

    在 dotnet core 发布的时候,会使用很多文件,这样发给小伙伴使用的时候不是很清真,本文告诉大家一个非官方的方法通过 warp 将多个文件打包为一个文件 和之前相同的方式发布一个 dotnet ...

  4. Python3使用过程中需要注意的点

    命名规则 变量 变量名只能是数字.字母或下划线的任意组合 变量名的第一个字符不能是数字 不能使用关键字作为变量名 变量的定义要具有可描述性 变量名不宜过长.不宜使用中文.拼音 常量(常用在配置文件中) ...

  5. activiti工作流引擎学习(二)

    1.连线 如果bpmn文件和java文件放在同一目录下,需要配置buildPath: 使用流程变量,设置连线需要的流程变量的名称,并设置流程变量的值,流程会按照指定的连线完成任务. 1.1一个活动中可 ...

  6. dotnet 控制台读写 Sqlite 提示 no such table 找不到文件

    在使用 dotnet 读写 Sqlite 可以通过 EF Core 的方法,但是在 EF Core 创建的数据库可能和读写的数据库不是相同的文件 在我运行代码的时候发现在通过迁移创建数据库,创建的文件 ...

  7. 【Docker】Ubuntu16.04将Docker升级至最新版

    1.使用curl升级到最新版 curl -fsSL https://get.docker.com/ | sh 2.重启Docker sudo systemctl restart docker 3.设置 ...

  8. 用VISA工具驱动继电器外设

    1.驱动方式:TCP 2.开发过程 第一步:外设识别 TCP方式将继电器插上网线后,并不能像串口一样自动识别到这个外设,需要手动连接.打开NI MAX后,右击设备与接口,然后点击新建,双击VISA T ...

  9. node.js UDP NAT 穿透实现

    源码:https://github.com/zhongchengyi/node-udp-trunnel-demo 1.原理 A登录Server, NAT A 分配端口11000,Server得到A的地 ...

  10. beta 1/2 阶段中间产物提交入口

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9918 git地址:https://e.coding.net/Eustia ...