前言
     前后端开发分的越来越细化,为了方便前端工程师更好的调试后端工程师嵌套的代码,前后分离技术就出现了,简单理解其实就是Ajax异步将数据提供给JavaScript,由JavaScript进行迭代展现渲染成想要的效果,这样做还可以使页面数据异步化,页面展现时只需要加载页面结构及js、css、image等,而这些静态文件还可以通过CDN进行优化,缩短了打开页面白屏的时间,进一步加快了用户看到页面的速度,优点还是非常多的。
     前端MVVM框架有很多Vue.js、Angular2.js、React.js、juicer.js(ali)、artTemplate.js(tencent)、doT.js等等有很多,各有优势,前三个属于重量级功能大而全,而我的需求只需要简单迭代即可,所以选择后三个轻量级的,推荐使用juicer.js是阿里的而且支持Node.js,语法不太抽象很容易理解。
     无论那种框架实际应用时主要的功能就是循环、判断、输出这三个,下面我们根据日常需要撰写一下应用实例。
一、juicer的应用
官网地址:http://juicer.name/
1、基本语法
//变量输出${变量}
${var flag = "test"} //变量避免转义输出$${变量} //循环{@each}...{@/each}
{@each list as item}
//do something...
${item.prop}
{@/each}
{@each list as item, index}
//do something...
${index}
//此处的index代表当前索引
{@/each} //判断{@if}...{@/if}
{@if ${item.prop == 'a'}}
//do something...
{@else if}
//do something...
{@else}
//do something...
{@/if} //注释{# 内容} //辅助循环{@each i in range(m, n)}
{@each i in range(5, 10)}
${i} //输出5 6 7 8 9
{@/each} //嵌套模板{@include tpl, data}

2、引入js文件

<script type="text/javascript" src="~/static/js/jquery/jquery-min.js"></script><!--可以不用jquery,使用默认js语法即可-->
<script type="text/javascript" src="~/static/js/juicer/juicer-min.js"></script>

3、设置自定义标签

不同开发语言可能导致对不同的模板符号编译错误,我们可以自定义模板符号规则
//页面加载后设置自定义标签
$(function () {
juicer.set({
'tag::operationOpen': '{*', //操作标签-开
'tag::operationClose': '}', //操作标签-关
'tag::interpolateOpen': '${', //变量标签-开
'tag::interpolateClose': '}', //变量标签-关
'tag::noneencodeOpen': '$${', //禁止转义标签-开
'tag::noneencodeClose': '}', //禁止转义标签-关
'tag::commentOpen': '{#', //注释标签-开
'tag::commentClose': '}', //注释标签-关
'cache': true, //[默认开启]是否缓存模板编译结果,开启后会避免同一模板多次数据渲染时重复编译模板,减少编译模板所耗的时间
'script': true, //[默认开启]是否清除空白,清除模板中的空白,包括换行、回车等
'error handling': true, //[默认开启]是否处理错误
'detection': true //[默认开启]是否检测变量是否定义,开启后如果变量未定义,将用空白字符串代替
});
})

4、编写展示模版

<script id="tplAccountAll" type="text/template">
<thead>
<tr class="bg-warning">
<th class="text-center">账号</th>
<th class="text-center">现金余额</th>
<th class="text-center">冻结资金</th>
<th class="text-center">账号描述</th>
<th class="text-center">绑定手机</th>
<th class="text-center">绑定邮箱</th>
<th class="text-center">独立核算</th>
<th class="text-center">状态</th>
<th class="text-center">创建时间</th>
<th class="text-center">操作</th>
</tr>
</thead>
{*each list as item}
<tr>
<td class="text-primary">${item.AccountNo}</td>
<td class="text-right text-success">${item.Balance.toFixed(2)}</td>
<td class="text-right text-success">${item.FreezeBalance.toFixed(2)}</td>
<td class="text-center">${item.AccountDescription}</td>
<td class="text-center">${item.Mobile}</td>
<td class="text-center">${item.Email}</td>
<td class="text-center">${item.IsSelfFinanced}</td>
<td class='${item.Status == 1 ? "text-success" : "text-danger"} text-center'>${item.StatusName}</td>
<td class="text-center">${item.CreateTime}</td>
<td class="text-center">
{*if item.AccountNo != item.CustomerNo}
<a href="javascript:void(0)" onclick="updateStatus('${item.AccountNo}',${item.Status}, this)">[${item.StatusOperation}]</a>
{*/if}
<a href="~/AccountManage/GrantRuleToAccount?AccountNo=${item.AccountNo}" target="_blank">[分配权限]</a>
<a href="~/AccountManage/SetCreditLineLimit?AccountNo=${item.AccountNo}" target="_blank">[授信限额设定]</a>
<a href="javascript:void(0)" onclick="showPayBusInfo('${item.AccountNo}')">[查看授信余额]</a>
</td>
</tr>
{*/each}
</script>

5、渲染模版展示内容

<script type="text/javascript">
$(function () {
$.post("/AccountManage/AjaxGetAccountListData", function (data) {
data = { list: JSON.parse(data) };
console.log(data);
//获取模版
var tplAccountAll = $("#tplAccountAll").html();
//渲染数据
var htmlContent = juicer(tplAccountAll, data);
//显示内容
$("#showAccountAll").html(htmlContent);
});
})
</script>

二、doT的应用

 1、基本语法 
{{= }} for interpolation 输出
{{ }} for evaluation 代码块
{{~ }} for array iteration 迭代
{{? }} for conditionals 条件
{{! }} for interpolation with encoding 编码输出
{{# }} for compile-time evaluation/includes and partials
{{## #}} for compile-time defines

2、引入js文件

<script src="jquery.min.js"></script>
<script src="doT.min.js"></script>

3、编写展示模板

<script id="tmpBuyAndBuy" type="text/x-dot-template">
{{ if(it && it.length > 0){ }}
<div class="guessTit">
<div class="guessLine abs"></div>
<span class="abs w200">根据购物车的商品,为您推荐</span>
</div>
<div class="guseeBig">
<p class="t2">90%的妈妈还买了以下商品</p>
</div>
<div class="guessLoveCon">
<ul class="guessCon clearfix">
{{ for(var i = 0; i < it.length; i++){ }}
{{ var item = it[i]; }}
<li>
<a href="{{=item.GoodsShowUrl}}">
<div class="hotProImg rel">
<img src="{{=item.GoodsImgUrl}}" alt="">
{{?item.NationPic}}
<div class="hotProflag abs"><img src="{{=item.NationPic}}" alt=""></div>
{{?}}
</div>
<div class="gupt">{{=item.SellingPoint}}</div>
<div class="guessProTit gray">{{=item.GoodsName}}</div>
<div class="guessMoney clearfix">
<span class="s1">¥<i>{{=item.GoodsPriceInteger}}</i>.{{=item.GoodsPriceDecimal}}</span>
<span class="s2">¥{{=item.MarketPrice.toFixed(2)}}</span>
</div>
</a>
</li>
{{ } }}
</ul>
</div>
{{ } }}
</script>

4、渲染模版展示内容

<script type="text/javascript">
var jsBuyAndBuy = jsBuyAndBuy || {};
jsBuyAndBuy.GetData = function (goodsids) {
if (goodsids) {
$.post("/Cart/AjaxBuyAndBuy", { goodsIds: goodsids }, function (data) {
//注入模板
var evalText = doT.template($("#tmpBuyAndBuy").text());
//填充内容
$("#cntBuyAndBuy").html(evalText($.parseJSON(data)));
//隐藏Loading
$("#loadBuyAndBuy").hide();
});
}
}
</script>

我这里只简单介绍一下使用方法,这些基本够我日常应用了,如果有更高难度的需求,还请查阅官方文档,此类模板使用方法都大同小异,学会一个其他的也就都会了,区别只有各自的语法标记不同而已。

MVVM前后分离轻量级框架应用juicer和doT.js的更多相关文章

  1. 互联网轻量级框架SSM-查缺补漏第八天(MyBatis插件plugin使用及原理)

    简言:今天进行第八天的记录(只是写了八天).有的时候看的多,有的时候看的少,看的少的时候就攒几天一起写了.而今天这个插件我昨天写了一下午,下班没写完就回去了,今天把尾收了,再加上一个过程图方便下面原理 ...

  2. CQRS轻量级框架【CQRSlite】学习使用小记

    前言 这几天在研究DDD和CQRS.快把我绕晕了.发现国外的好文质量还是挺高的.之所以先体验CQRSlite这个小框架,是因为看了一位大神写的文章:https://www.codeproject.co ...

  3. WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对

    WPF MVVM UI分离之<交互与数据分离>   在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...

  4. FluentData,它是一个轻量级框架,关注性能和易用性。

    http://www.cnblogs.com/zengxiangzhan/p/3250105.html FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.M ...

  5. 【开源】【前后端分离】【优雅编码】分享我工作中的一款MVC+EF+IoC+Layui前后端分离的框架——【NO.1】框架概述

    写博客之前总想说点什么,但写的时候又忘了想说点什么,算了,不说了,还是来送福利吧. 今天是来分享我在平时工作中搭建的一套前后端分离的框架. 平时工作大多时候都是在做管理类型的软件开发,无非就是增.删. ...

  6. 初步了解学习flask轻量级框架,

    关于flask我有话说 flask作为一个轻量级框架,它里面有好多扩展包需要下载,比较麻烦,而且有的时候flask需要在虚拟环境下运行,但是他的优点还是有滴 ,只要是用过Django的人,都会觉得fl ...

  7. DDD实战进阶第一波(四):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架三)

    上一篇文章我们讲了经典DDD架构对比传统三层架构的优势,以及经典DDD架构每一层的职责后,本篇文章将介绍基础结构层中支持DDD的轻量级框架的主要代码. 这里需要说明的是,DDD轻量级框架能够体现DDD ...

  8. DDD实战进阶第一波(三):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架二)

    了解了DDD的好处与基本的核心组件后,我们先不急着进入支持DDD思想的轻量级框架开发,也不急于直销系统需求分析和具体代码实现,我们还少一块, 那就是经典DDD的架构,只有了解了经典DDD的架构,你才能 ...

  9. JEECG前后端分离UI框架实战版本抢先体验(ng2-admin+Angular4+AdminLTE+WebStorm)

    JEECG前后端分离UI框架实战版本 - 抢先体验 (ng2-admin+Angular4+AdminLTE) 关键词: ng2-admin.Angular4.AdminLTE.Nodejs.Jeec ...

随机推荐

  1. 编辑sass报错:error style.scss (Line 3: Invalid GBK character "\xE5")解决办法

    cmd.exe /D /C call C:/Ruby23-x64/bin/scss.bat --no-cache --update header.scss:header.css error heade ...

  2. Java GC 日志详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt105 java GC日志可以通过 +PrintGCDetails开启 以Pa ...

  3. new和newInstance区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp55     在初始化一个类,生成一个实例的时候:newInstance() ...

  4. Arrays和Collections 对于sort的不同实现原理

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp46 1.Arrays.sort() 该算法是一个经过调优的快速排序,此算法 ...

  5. GIF、JPEG 和 PNG的区别在哪…

    原文地址:GIF.JPEG 和 PNG的区别在哪里?作者:苗得雨 GIF.JPEG 和 PNG 是三种最常见的图片格式. GIF:1987 年诞生,常用于网页动画,使用无损压缩,支持 256 种颜色( ...

  6. php的mysql语句里变量加不加单引号问题

    第一种[{$_GET['id']}加不加单引号都能正常执行没问题] $sql = "select * from `news` where `id` = {$_GET['id']}" ...

  7. css样式实现立方体制作

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. Java课程设计-学生基本信息管理 201521123036

    团队课程设计博客链接 团队博客链接 个人负责模块或任务说明 个人负责模块 任务说明 用户登录,注册 登录,注册,判断用户是否存在,添加用户 学生信息管理菜单 按钮,跳转相应界面,退出程序 学生信息添加 ...

  9. 201521123026《JAVA程序设计》第11周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 1.多线程同步:限制某个资源在同一时刻只能被一个线程访问.. 2.同步代码块:`synchronized(lock ...

  10. 201521123085 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...