doT的高级用法及loadData的使用

本文出自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,把json的url变成字符串形式
            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内的css、js的路径的根路径!!!
                            data: html //dot渲染出来的html页面  成为frame的内容,生成的frame页面整个页面都可以用dot模板语法因为整个页面就是模板
                    });
            }, 'json');
    }

复制代码
这里的loadfile是官方的api方法
有同步和异步两种,都进行封装过,但感觉封装得不够好,只展现一个同步,不然代码不完整。

function loadfile(url) {
return api.readFile({
sync: true,
path: url || '',
});
}
复制代码
还有官方的$api.get方法是不会返回tag用来取消ajax请求的

//json转url参数
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:;" οnclick="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>
{{~}}
{{??}}
{{?}}
复制代码

### Numpy 高级操作教程 #### 数组切片与索引 NumPy 提供了灵活的数组切片和索引方式,可以方便地访问子数组。对于多维数组而言,这尤其有用。 ```python import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print("原始矩阵:") print(arr) sub_arr = arr[:2, :2] # 获取前两行、前两列构成的新矩阵 print("\n获取前两行、前两列构成的新矩阵:") print(sub_arr) ``` 除了基本的整数索引外,还可以通过布尔掩码来进行更复杂的筛选[^2]。 ```python mask = (arr % 2 == 0) # 找到所有偶数值的位置 even_elements = arr[mask] print(f"\n原矩阵中的偶数元素:{even_elements}") ``` #### 广播机制 广播允许不同形状的数组之间执行算术运算,在某些情况下会自动扩展较小维度以匹配较大维度。 ```python a = np.arange(3).reshape((3, 1)) b = np.arange(3) c = a + b print('\na:') print(a) print('b:', b) print('a+b的结果(c):') print(c) ``` 这里 `a` 的形状为 `(3, 1)` 而 `b` 形状为 `(3,)` ,当两者相加时 NumPy 自动将 `b` 向上复制成 `(3, 3)` 来完成逐元素求和。 #### 矩阵乘法与其他线性代数函数 NumPy 支持多种高效的线性代数计算方法,比如矩阵乘法、特征值分解等。 ```python A = np.random.rand(4, 3) B = np.random.rand(3, 2) C = A @ B # 或者使用 dot 函数 C=np.dot(A,B) print("\n随机生成两个矩阵并做矩阵乘法得到新矩阵C:") print(C) eigenvalues, eigenvectors = np.linalg.eig(np.cov(C.T)) # 计算协方差矩阵及其特征向量 print("\n协方差矩阵的特征值:", eigenvalues) ``` #### 文件读写功能 能够轻松保存加载 `.npy`,`.npz` 格式的文件,也可以处理 CSV 和其他常见数据格式。 ```python data_to_save = {'array': c} np.savez('./temp_data.npz', **data_to_save) loaded_data = np.load('./temp_data.npz')['array'] print("\n从 .npz 文件载入的数据:\n", loaded_data) ``` 上述例子展示了如何利用 NumPy 进行一些较为复杂的数据处理任务,包括但不限于高效内存管理下的大规模科学计算应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值