前言
     前后端开发分的越来越细化,为了方便前端工程师更好的调试后端工程师嵌套的代码,前后分离技术就出现了,简单理解其实就是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. poj 2455 二分+最大流

    这个因为点少用邻接矩阵做的. 题意:求由1到n的t条不重复路径中最大边权值的最小值. 思路:先对边权进行排序,然后二分边权值,建图求从1到n的最大流,当最大流为t时便求出答案. 代码: #includ ...

  2. 集美大学网络1413第十次作业成绩(团队六) -- 展示博客(Alpha版本)

    题目 团队作业6--展示博客(Alpha版本) 团队作业6成绩  团队/分值 简介& 项目地址 项目目标 (典型用户. 功能描述. 预期用户数量) 如何满足 用户需求 已完成目标 团队分工 团 ...

  3. 团队作业8——第二次项目冲刺(Beta阶段)--5.24 forth day

    团队作业8--第二次项目冲刺(Beta阶段)--5.24 forth day Day four: 会议照片 项目进展 Beta冲刺的第四天,以下是今天具体任务安排: 队员 昨天已完成的任务 今日计划完 ...

  4. 团队作业8——第二次项目冲刺(Beta阶段)--第六天

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 学号 成员 贡献比 201421123001 廖婷婷 16% 201421123002 翁珊 16% 201421123004 ...

  5. 201521123091 《Java程序设计》第13周学习总结

    Java 第十三周总结 第十三周的作业. 目录 1.本章学习总结 2.Java Q&A 3.码云上代码提交记录及PTA实验总结 4.课后阅读 1.本章学习总结 1.1 以你喜欢的方式(思维导图 ...

  6. spring+mybatis的简单配置示例

    简单代码结构: //Book.java package com.hts.entity; public class Book { private String id; private String bo ...

  7. 扫雷游戏制作过程(C#描述):第四节、菜单操作

    前言 这里给出教程原文地址. 该项目已经放在github上托管. 菜单操作 我们现在的程序单击菜单的时候不会有任何反应,这一节我们主要介绍菜单的相关代码,使得菜单能够正常使用. 现在我们希望在对应级别 ...

  8. 201521123110《Java程序与设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 时间数据不同 ...

  9. 201521123066 《Java程序设计》第十四周学习总结

    1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) - ...

  10. java:接口特性 接口与抽象类/普通类的区别

    接口 书面定义: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 在ja ...