案例


因为公司业务需要频繁调用接口,后端返回的都是json树对象,需要有些特殊的方法做大量判断和数据处理,显然目前简单语法已经不能满足业务需要了,需要自己定制一些
方法来处理业务逻辑。

例如后台返回的的json对象结构如下:

//数据
var data = {
<span style="white-space:pre"> </span>time: 1408536771253,
queryRecord:{
queryHistory:{
overdue:[],
query:{time:'100'},
name:'fdsafdsa'
} }
};

我想在页面显示的效果有数据时如下:

查询结果:逾期日期为 N ,预期次数为 N 次,查询次数为 N 次, 名字为:xxx

没有数据时,显示如下:

查询结果:查询成功,无记录

使用目前现有artTemplate的简单语法,如下:

{{if queryHistory==null || queryHistory.length==0|| queryHistory.overdue==null || queryHistory.overdue.length.length==0||queryHistory.query==null || queryHistory.query.length==0||queryHistory.name ==null || queryHistory.name.length==0}}
查询结果:查询成功,无记录
{{else}}
查询结果为:逾期时间为{{queryHistory.ovedue.date}},逾期次数为{{queryHistory.ovedue.time}},查询次数为{{queryHistory.query.time}},名字为:{{queryHistory.name}}{{/if}}

因为我不确定接口返回的数据是否有空值,我期望的结果应该是queryHistory下只要有属性是空的,我就希望显示最后查询结果为:“查询成功,无记录”,这样如果我使用原生的语法,我不得不做大量的判断,去判断我需要的属性是否会有空值,不然调用的时候会有异常



解决方案


我通过自定义一个函数去根据我业务需要去做判断,那样我就不需要在页面写大量代码了,只要我输入一个Json对象,它就给我返回是否有属性为空即可

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>helper-demo</title>
<script src="../dist/template.js"></script>
<script src="../dist/jquery-2.1.4.js"></script>
</head> <body>
<h1>辅助方法</h1>
<div id="content"></div>
<script id="test" type="text/html"> {{if hasEmptyProperties(testData)}}
查询成功,无该用户
{{else}}
查询该成功:xxx {{/if}} </script> <script>
//递归需要用到的变量
var exit = false;
var isExist = false;
/**
*对指定Json对象遍历其属性判断是否存在空值,只要存在空属性就代表无效对象,返回false
* <pre>
* Json对象1: testData:{
* queryHistory:{
* array:[],
* query:{},
* name:'fdsafdsa'
* }
* Json对象2: testData:{
* queryHistory:{
* overtime:[],
* query:{time:'100'},
* name:'fdsafdsa'
* }
* Json对象3: testData:{
* queryHistory:{}
* }
* 在模板输入: {{if isValidObject(testData)}}
* 返回: true;
*
*
* </pre>
*@Param data 要进行校验的Json对象
*@Param args Json对象中的属性参数
*@author liangyh
*/
template.helper("hasEmptyProperties",function(data){
var isInvalid = false;
isInvalid = isExistEmptyProperties(data);
//维护全局变量
exit = false;
isExist = false;
return isInvalid;
}); function isExistEmptyProperties(data) {
//中止执行当前递归
if(exit==true){
return isExist;
}
if (typeof data == "object") {
if ($.isEmptyObject(data)) {
isExist = true;
exit=true;//满足条件,退出递归
} else {
$.each(data, function (k, v) {
// k is either an array index or object key
isExist=isExistEmptyProperties(v);
});
}
}
else {
// jsonOb is a number or string
if($.isEmptyObject(data)){
isExist=true;
exit=true;//满足条件,退出递归
}
}
return isExist;
} //数据
var data = {
time: 1408536771253,
testData:{
queryHistory:{
overtime:[],
query:{time:'100'},
name:'fdsafdsa'
} }
}; var html = template('test', data);//渲染模板
document.getElementById('content').innerHTML = html;
</script>
</body>
</html>

注意:上面方法之所以用到全局变量,是因为我需要跳出递归,如果不使用全局变量去控制,那么递归时会导致每一个递归都会去执行,最后结果会有问题,因次我用到了一个exist变量作为退出递归的标志


页面输出结果如下:





artTemplate--模板使用自定义函数(1)的更多相关文章

  1. 在ecshop模板使用自定义函数

    https://blog.csdn.net/shaolinld/article/details/46400485 在ecshop模板使用自定义函数 可以增加自定义函数,在模板直接调用,例如: {$us ...

  2. 四、smarty模板的自定义函数

    smarty模板的自定义函数(这里介绍的是常用) 分为三个种类: 1.  变量调节器 2.  函数 3.  块函数 三个种类插件的用法: 1.  变量调解器的用法, <{$var|myfun:a ...

  3. 模板语言 自定义函数simple_tag

    模板语言自带的一些处理函数:通过管道符来处理 帮助方法:{{ item.event_start|date:"Y-m-d H:i:s"}}  转换成日期时间型{{ bio|trunc ...

  4. art-template自定义函数

    自定义函数 // 百分比计算 template.defaults.imports.percentage = function (num1, num2) { var res; if(!num1 & ...

  5. Thinkphp模板怎么使用自定义函数

    内置模板引擎支持对模板变量使用函数,并支持多个函数同时使用. 注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|fu ...

  6. Thinkphp模板中使用自定义函数的方法

    注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...

  7. thinkphp模板中使用自定义函数

    注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...

  8. 模板自定义函数 template function

    sqlite3中的日期默认是UTC,当日期字段的默认值是CURRENT_TIMESTAMP时,这个日期和北京时间CST少了8小时. 网上建议说数据库里用UTC,读取数据时再转换为当地时间. web页面 ...

  9. django 笔记8 url模板 自定义函数 simple_tag

    感谢alex老师~ 知识点: URL - 两个没见 url>路由系统> 函数或类 > 返回字符串 Form表单提交: 提交 >url>函数或类中的方法 -.. HttpR ...

  10. 五,Smarty模板技术/引擎——自定义函数机制

    自建函数是smarty提供的函数,不允许修改,只能被调用: 自定义函数是自己编写函数,注册成为smarty的函数,之后可以被调用: 示例:使用smarty自定义函数的机制,编写一个函数myfun1,通 ...

随机推荐

  1. 如何利用腾讯云COS为静态博客添加动态相册

    前言 本文首发于个人网站Jianger's Blog,欢迎访问订阅.个人博客小站刚建站不久,想着除了主题里的功能外再添加上相册模块,于是半搜索半摸索把相册模块搞出来了,最后采用了利用腾讯云对象存储作图 ...

  2. ### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: cn.xiaojian.blog.po.BlogType and java.lang.String ### Cause: java.lang.IllegalArgumentException: ...

    ### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: cn.xiaoj ...

  3. 小小知识点(三十八)MPSK和MQAM调制的实现——利用IQ调制

    IQ调制的原理 (一)调制基本原理 (二)调制基本原理 利用IQ调制实现MPSK(QPSK 8PSK BPSK)和MQAM(16QAM 64QAM)调制     (一)利用IQ调制实现QPSK调制   ...

  4. 天天都在用Git,那么你系统学习过吗?(一)学习过程

    你系统学习Git了吗? 使用Mac编程的好处,不是因为Mac长得好看 Git内容学习准备 如果你还没有用Git,就不要写代码了. GitHub仓库的使用. 新员工入职的时候,会让他先用一周的时间去学习 ...

  5. spring boot事务管理

    spring boot集成事务十分的简单,只需要在启动类上面增加@EnableTransactionManagement注解,然后在需要实现事务的方法上添加@Transactional注解就可以了.下 ...

  6. Fabric1.4:链码管理与测试

    1 链码介绍 智能合约在 Hyperledger Fabric 中称为链码(chaincode),是提供分布式账本的状态处理逻辑.链码被部署在fabric 的网络节点中,能够独立运行在具有安全特性的受 ...

  7. 【一起学源码-微服务】Feign 源码三:Feign结合Ribbon实现负载均衡的原理分析

    前言 前情回顾 上一讲我们已经知道了Feign的工作原理其实是在项目启动的时候,通过JDK动态代理为每个FeignClinent生成一个动态代理. 动态代理的数据结构是:ReflectiveFeign ...

  8. 输入n个字符串,找出最长最短字符串(若有个数相同的,都打印出来)

    首先,要求找到最长最短字符串,我们应该用数组将其存起来,输入的个数是不固定的,我们就可以用Scanner获取要输入的个数,最终找到的个数也不固定,我们可以封装两个方法,并且返回值类型为数组. 我遇到的 ...

  9. Spring Boot2 系列教程 (三) | 使用 LomBok 提高开发效率

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 上周去了开年会,去的地方是温泉度假村.老实说,我是无感的,90% 是因为没中奖(老板太抠,两百人只抽三个奖),10 ...

  10. Core 定时任务之TimeJob

    第一:引入NuGet包: Install-Package Pomelo.AspNetCore.TimedJob -Version -rtm- 第二: 在StartUp 中注册Job: public c ...