基于jQuery的JavaScript模版引擎JsRender使用指南

前言

JsRender是一款基于jQuery的JavaScript模版引擎,它具有如下特点:

·  简单直观

·  功能强大

·  可扩展的

·  快如闪电

这些特性看起来很厉害,但几乎每个模版引擎,都会这么宣传。。。

由于工作需要,小菜才接触到此款模版引擎。使用了一段时间,发现它确实比较强大,但小菜觉得有些地方强大的过头了,反倒让人觉得很难理解。

另一方面,JsRender的官方文档比较详细,但其他资料出奇的少,遇到点什么问题,基本搜不到,不仅仅是相关问题搜不到,几乎就是没有结果。

再加上JsRender有些地方确实是不好理解,所以急需小菜分享一些“最佳实践”。

基于最近一段时间的使用,小菜总结了一些实用经验,当然,这些经验在官方文档上是找不到的。

注意:本文不是基础入门教程,以下例子中自带注释,不做过多说明,读者自行体会,不懂的地方可以留言。

 嵌套循环使用#parent访问父级数据(不推荐)

代码如下:

<!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
     <title>嵌套循环使用#parent访问父级数据 --- by 杨元</title>
     <style>
     </style>
   </head>
   <body>
     <div>
       <table>
         <thead>
           <tr>
             <th width="10%">序号</th>
             <th width="10%">姓名</th>
             <th width="80%">家庭成员</th>
           </tr>
         </thead>
         <tbody id="list">
         </tbody>
       </table>
     </div>
     <script src="jquery.min.js"></script>
     <script src="jsviews.js"></script>
     <!-- 定义JsRender模版 -->
     <script id="testTmpl" type="text/x-jsrender">
       <tr>
         <td>{{:#index + 1}}</td>
         <td>{{:name}}</td>
         <td>
           {{for family}}
             {{!-- 利用#parent访问父级index --}}
             <b>{{:#parent.parent.index + 1}}.{{:#index + 1}}</b>
             {{!-- 利用#parent访问父级数据,父级数据保存在data属性中 --}}
             {{!-- #data相当于this --}}
             {{:#parent.parent.data.name}}的{{:#data}}
           {{/for}}
         </td>
       </tr>
     </script>
     <script>
       //数据源
       var dataSrouce = [{
         name: "张三",
         family: [
           "爸爸",
           "妈妈",
           "哥哥"
         ]
       },{
         name: "李四",
         family: [
           "爷爷",
           "奶奶",
           "叔叔"
         ]
       }];
       //渲染数据
       var html = $("#testTmpl").render(dataSrouce);
       $("#list").append(html);
     </script>
   </body>
 </html>

嵌套循环使用参数访问父级数据(推荐)

代码如下:

<!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
     <title>嵌套循环使用参数访问父级数据 --- by 杨元</title>
     <style>
     </style>
   </head>
   <body>
     <div>
       <table>
         <thead>
           <tr>
             <th width="10%">序号</th>
             <th width="10%">姓名</th>
             <th width="80%">家庭成员</th>
           </tr>
         </thead>
         <tbody id="list">
         </tbody>
       </table>
     </div>
     <script src="jquery.min.js"></script>
     <script src="jsviews.js"></script>
     <!-- 定义JsRender模版 -->
     <script id="testTmpl" type="text/x-jsrender">
       <tr>
         <td>{{:#index + 1}}</td>
         <td>{{:name}}</td>
         <td>
           {{!-- 使用for循环时,可以在后边添加参数,参数必须以~开头,多个参数用空格分隔 --}}
           {{!-- 通过参数,我们缓存了父级的数据,在子循环中通过访问参数,就可以间接访问父级数据 --}}
           {{for family ~parentIndex=#index ~parentName=name}}
             <b>{{:~parentIndex + 1}}.{{:#index + 1}}</b>
             {{!-- #data相当于this --}}
             {{:~parentName}}的{{:#data}}
           {{/for}}
         </td>
       </tr>
     </script>
     <script>
       //数据源
       var dataSrouce = [{
         name: "张三",
         family: [
           "爸爸",
           "妈妈",
           "哥哥"
         ]
       },{
         name: "李四",
         family: [
           "爷爷",
           "奶奶",
           "叔叔"
         ]
       }];
       //渲染数据
       var html = $("#testTmpl").render(dataSrouce);
       $("#list").append(html);
     </script>
   </body>
 </html>

 自定义标签(custom tag)中使用else(强烈不推荐)

代码如下:

<!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
     <title>自定义标签中使用else --- by 杨元</title>
     <style>
     </style>
   </head>
   <body>
     <div>
       <table>
         <thead>
           <tr>
             <th width="50%">名称</th>
             <th width="50%">单价</th>
           </tr>
         </thead>
         <tbody id="list">
         </tbody>
       </table>
     </div>
     <script src="jquery.min.js"></script>
     <script src="jsviews.js"></script>
     <!-- 定义JsRender模版 -->
     <script id="testTmpl" type="text/x-jsrender">
       <tr>
         <td>{{:name}}</td>
         <td>
           {{!-- isShow为自定义标签,price是传入的参数,status是附加属性 --}}
           {{isShow price status=0}}
             {{:price}}
           {{else price status=1}}
             --
           {{/isShow}}
         </td>
       </tr>
     </script>
     <script>
       //数据源
       var dataSrouce = [{
         name: "苹果",
         price: 108
       },{
         name: "鸭梨",
         price: 370
       },{
         name: "桃子",
         price: 99
       },{
         name: "菠萝",
         price: 371
       },{
         name: "橘子",
         price: 153
       }];
       //自定义标签
       $.views.tags({
         "isShow": function(price){
           var temp=price+''.split('');
           if(this.tagCtx.props.status === 0){
             //判断价格是否为水仙花数,如果是,则显示,否则不显示
             if(price==(Math.pow(parseInt(temp[0],10),3)+Math.pow(parseInt(temp[1],10),3)+Math.pow(parseInt(temp[2],10),3))){
               return this.tagCtxs[0].render();
             }else{
               return this.tagCtxs[1].render();
             }
           }else{
             return "";
           }
         }
       });
       //渲染数据
       var html = $("#testTmpl").render(dataSrouce);
       $("#list").append(html);
     </script>
   </body>
 </html>

用helper代替自定义标签(推荐)

代码如下:

<!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
     <title>用helper代替自定义标签 --- by 杨元</title>
     <style>
     </style>
   </head>
   <body>
     <div>
       <table>
         <thead>
           <tr>
             <th width="50%">名称</th>
             <th width="50%">单价</th>
           </tr>
         </thead>
         <tbody id="list">
         </tbody>
       </table>
     </div>
     <script src="jquery.min.js"></script>
     <script src="jsviews.js"></script>
     <!-- 定义JsRender模版 -->
     <script id="testTmpl" type="text/x-jsrender">
       <tr>
         <td>{{:name}}</td>
         <td>
           {{!-- 利用原生的if做分支跳转,利用helper做逻辑处理 --}}
           {{if ~isShow(price)}}
             {{:price}}
           {{else}}
             --
           {{/if}}
         </td>
       </tr>
     </script>
     <script>
       //数据源
       var dataSrouce = [{
         name: "苹果",
         price: 108
       },{
         name: "鸭梨",
         price: 370
       },{
         name: "桃子",
         price: 99
       },{
         name: "菠萝",
         price: 371
       },{
         name: "橘子",
         price: 153
       }];
       //Helper
       $.views.helpers({
         "isShow": function(price){
           var temp=price+''.split('');
           if(price==(Math.pow(parseInt(temp[0],10),3)+Math.pow(parseInt(temp[1],10),3)+Math.pow(parseInt(temp[2],10),3))){
             return true;
           }else{
             return false;
           }
         }
       });
       //渲染数据
       var html = $("#testTmpl").render(dataSrouce);
       $("#list").append(html);
     </script>
   </body>
 </html>

演示代码打包下载:http://xiazai.jb51.net/201412/yuanma/JsRender_Demo(jb51.net).rar

(0)

相关推荐

  • javascript模版引擎-tmpl的bug修复与性能优化分析

    精妙的 tmpl 前端模板类开源的不少,但最属 jQuery 作者 John Resig 开发的 "javascript micro templating" 最为精妙,寥寥几笔便实现了模板引擎核心功能. 它的介绍与使用方式请看作者博客:http://ejohn.org/blog/javascript-micro-templating/ 让我们先看看他的源码: 复制代码 代码如下: (function(){ var cache = {}; this.tmpl = function (st

  • node.js 使用ejs模板引擎时后缀换成.html

    这是一个小技巧,看着.ejs的后缀总觉得不爽,使用如下方法,可以将模板文件的后缀换成我们习惯的.html. 1.在app.js的头上定义ejs: 复制代码 代码如下: var ejs = require('ejs'); 2.注册html模板引擎: 复制代码 代码如下: app.engine('html',ejs.__express); 3.将模板引擎换成html: 复制代码 代码如下: app.set('view engine', 'html'); 4.修改模板文件的后缀为.html. 好了,任

  • javascript轻量级模板引擎juicer使用指南

    使用方法 编译模板并根据数据立即渲染出结果 juicer(tpl, data); 仅编译模板暂不渲染,返回一个可重用的编译后的函数 var compiled_tpl = juicer(tpl); 根据给定的数据对之前编译好的模板进行渲染 var complied_tpl = juicer(tpl); var html = complied_tpl.render(data); 注册/注销自定义函数(对象) juicer.register('function_name', function); ju

  • js动画(animate)简单引擎代码示例

    用惯了jquery的同学,相信都很欣赏其动画引擎.确实相对比较完善!如果,如果想像力足够丰富的话,相信可以做出超出想像的效果.当然,跟2d库比起来,还是相差相当一段距离.jquery压根也不是专门为动画而设计的.模拟真实世界方面,还是不足的.但在web世界里还是游刃有余的.动画其实一直是flash的专属领地(web区哉).只是它常常沦为黑客攻击的漏洞所在,而且要装插件,有时候文件实在太大,而且性耗实在是高啊.html5出现后,其实adobe自己都转移阵地到html5了.当然,我觉得很长一段时间内

  • JavaScript语法着色引擎(demo及打包文件下载)

    应 得意小蛇 的建议,我整理了一下去年写的JavaScript语法着色引擎,并提供下载,喜欢的尽管拿去,嘿嘿 总的来说是很简单的东西,只是提供了关键字的着色以及一些基本的语法(例如注释,字符串,正则等等),从demo中应该很容易看到其用法,这里简单介绍下: 类名:Lighter 通过new Lighter()可以得到一个着色引擎实例,假设为lighter,有以下属性和方法: 语言属性:lighter.language 这个属性的范围是可以根据语法文件的数量自己添加的,提供的demo中有'cpp'

  • 漫谈JS引擎的运行机制 你应该知道什么

    javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等,这些概念正是JS引擎工作的核心组件.这篇文章的目的不是孤立的为你讲解每一个概念,而是通过一个简单的demo来展开分析,全局讲解JS引擎从定义到执行的每一个细节,以及这些概念在其中所扮演的角色. var x = 1; //定义一个全局变量 x function A(y){ var x = 2; //

  • javascript 多种搜索引擎集成的页面实现代码

    - 输入一个关键词,鼠标点击后面的搜索引擎链接,即可进入到该引擎的页面 - 如果输入关键词后敲回车,则使用默认搜索引擎,而每选择新的搜索引擎,默认引擎也会随之改变 - 自动记忆上次使用的搜索引擎,后面添加* 源代码如下,使用了多种IE/FF的适应办法: 复制代码 代码如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"&

  • 详解Javascript模板引擎mustache.js

    本文总结它的使用方法和一些使用心得,内容不算很高深,纯粹是入门内容,看看即可.不过要是你还没有用过此类的javascript引擎库,那么本文还是值得你一读的,相信在你了解完它强大的功能和简单用法之后,一定会迫不及待地将之用于你的工作当中. 1. 从一个简单真实的需求讲起 目前公司做了一个统一的开发平台,后台封装了MVC的接口和数据增删改查的接口,前端我自己用bootstrap+手写各类组件的方式弄了一套开发框架:集成了CAS,在CAS的基础上,首先做了一套统一权限管理系统,这个系统是我们开发平台

  • 为JavaScript提供睡眠功能(sleep) 自编译JS引擎

    即然该功能如此需要,但为什么js中不提供这样的函数呢? 目前浏览器都是在UI线程解析js,以火狐浏览器为例,我重新编译了js引擎,并且在js引警中添加了sleep方法,该方法调用c语言的线程睡眠函数. 将方法附加到Object上,方法签名为sleep();无参数.默认休眠1秒钟,如果你在js中调用该函数,浏览器UI界面将被阻碍. 另外如果你的js函数存在死循环,浏览器的js解析会检测到js执行超时会提醒你是否终止执行本页面的js. 最后提供新编译的js引擎,将它们替换firefox下的js引擎即

  • jsp搜索引擎

    package coreservlets; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.net.*; public class SearchEngines extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws Servle

  • Javascript 引擎工作机制详解

    Javascript 引擎工作机制 javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等,这些概念正是JS引擎工作的核心组件.这篇文章的目的不是孤立的为你讲解每一个概念,而是通过一个简单的demo来展开分析,全局讲解JS引擎从定义到执行的每一个细节,以及这些概念在其中所扮演的角色. var x = 1; //定义一个全局变量 x function A

随机推荐