jquery 模版 JsRender

别难过别伤心:哈哈

JsRedner和JsViews(JsViews是再JsRender基础上的进一步封装)被称为下一代的Jquery模板,官方地址:https://github.com/BorisMoore/jsrender;https://github.com/BorisMoore/jsviews。Juqrey模板是一个javascript引擎,他最直接的作用就是:1、代码重用,减少代码量;(更容易编写)2、抛弃繁琐的字符串拼接、提高代码可见性、简化维护。

为什么需要模板

相信很多人都写过见过这样的代码

var html = '';
$.each(data.persons, function (i, item) {
     html += "<tr><td>" + item.FirstName + "</td><td><a href='/Person/Edit/"
        + item.PersonID + "'>Edit</a> | <a href='/Person/Details/" 
        + item.PersonID + "'>Details</a> | <a href='/Person/Delete/" 
        + item.PersonID + "'>Delete</a></td></tr>";
});
$('#XXX').append(html);
你可以这样写,这样写很明显的坏处就是:这样的代码可见性太低,很难维护。或许你几个月之后再来看你的代码,你要花半个小时甚至更多才能得出代码的展示结构。下面来看个JsRender的例子:
//Templates   定义模版
<script type="text/x-jsrender" id="personListTemplate">
    {{for persons}}
        <tr>
            <td>{{:FirstName}}</td>
            <td>
                <a href="/Person/Edit/{{:PersonID}}">Edit</a> | 
                <a href="/Person/Details/{{:PersonID}}">Details</a> | 
                <a href="/Person/Delete/{{:PersonID}}">Delete</a>
            </td>
        </tr>
    {{/for}}
</script>
//Render Data
var html  = $("#personListTemplate").render(data);
//Insert into Container
$("#XXX").append(html);

代码的结构确实清晰可见了,但是代码越看越多了。首先,这是错觉,因为这里的东东都是严格换行了的。其次,这里省去了item、each等字符复杂字符,貌似更容易编写了。


 JsRender和Jquery Template

  既然JsRender是下一代Jquery模板,那么谁是上一代模板呢?Jquery Template。Jquery Template的特点这里就不废话了,说说JsRedner和Jquery Template的差距:

    1、JsRender渲染非常快,网上说的是“和最快一样快”(当然我也不知道他到底有多快)。对于简单的模板的渲染,JsRender的渲染速度比Js Template可以快20倍。

    2、JsRender对Dom和Jquery不存在任何依赖(注:不依赖并不是说不使用...)。在Jquery Template 必须用$.template(name,'XXX')标记模板,然后渲染。JsRedner不用,他甚至可以直接渲染字符串。

    3、JsRender和Jquery Template相比,JsRender仅仅需要更少的代码,2就是一个例子。

  JsRender三要素和行为

  从上面贴的代码可以看出,JsRender需要三要素:模板(Template)、容器(Container:简单。。。)、数据(Data:数据可以使各种js对象:如数组,object等等)。主要行为为:渲染模板、将渲染结果插入容器(这个太简单了)。说下渲染模板先。。。

  JsRender渲染模板

  1、无需编译直接渲染: 

var html = $("#XXXXX").render(data); // XXX代表某个脚本标记,也就是上面的<script id="XXX" type="text/x-jsrender">.......</script>
      2、渲染前编译:



/*A、获取模板对象的方式编译*/
var xxxTemplate = $.templates("#xxxTemplate");//既可以是字符串也可以是脚本标记,B是字符串
var html = xxxTemplate.render(data);
/*B、指定模板名称的方式编译*/
$.templates('xxx','<b>{{:name}}</b>');
$.templates({
  'yyy','<b>{{:name}}</b>',
  'zzz','<b>{{:name}}</b>'
});
var html = $.render.xxx(data);//注意,第B种方式可以同时渲染多个模板,但是第A种方式不行

可以看出:

        1、无编译直接渲染的方式无法用于字符串的渲染;渲染前编译的方式字符串和脚本标记皆可。

        2、制定模板名称的方式编译可以同时编译多个模板,但是获取模板对象的方式编译只能编译一个模板。

  JsRender模板(Template)

  基本的jsRender标签:JsRender模板主要由html标记和jsrender标签(像上面的{{:XXX}})组成。所有的Jsrender标签都被两个大括号包裹,中间既可以是参数也可以使表达式(如:{{:#index}}和{{:#index+1}})。

下面看一下一些基本的Jsrender标签。

描述 例子 输出
参数firstName的值(未被Html编码) {{:firstName}} Madelyn
参数movie的属性--releaseYear的值(未被html编码) {{:movie.releaseYear}} 1987
比较(表达式,未被html编码) {{:movie.releaseYear < 2000}} true
经html编码的值(更加安全,但是要耗点内存) {{>movie.name}} Star Wars: Episode VI: <span style='color:purple;font-style: italic;'>Return of the Jedi</span>
经html编码的值 {{html:movie.name}} Star Wars: Episode VI: <span style='color:purple;font-style: italic;'>Return of the Jedi</span>


jsrender数据遍历基本语法如下:

{{for xxx}}
    <li>{{:property of xxx}}</li>
{{/for}}
有时候想获取xxx本身怎么办呢?如下:

{{for  xxx yyy}}
    <li>{{:#data}}</li>
{{/for}}
上面的例子要说明两点:

    1、for不仅仅可以遍历一组数据,他甚至可以同时遍历两组和多组数据(强大了吧...)。

    2、上面的#data就表示xxx和yyy本生。试想一下,如何xxx和yyy都表示一个基本元素(字符串、整数等等、任意交叉)的数组,那么这个是不是能很好的完成遍历呢?说道#data,不得不提一下#index,#data和#index都是内置的jsrender关键字。下面在一个例子:

    

//Template
{{for #data}}
        <h3>{{:name}}</h3>
        <ul>
        {{for language}}
             <li> {{:#parent.parent.data.name}} is learning {{:title}}</li>
        {{/for}}
        </ul>
{{/for}}
//Data
 var studnets = [
        {
            "name": "Mingjun Tang",
            "language": [{ "title": "English"},{ "title": "Franch"}]
        },
        {
            "name": "Ming Tang",
            "language": [{ "title": "English"}]
        }
];

遍历时#data充当了students,同时#parent.parent.data.XXX可以用于向上迭代。注意这里的data并不是student中的属性额,因为#parent向上迭代后返回的是一个jsrender对象只有,#parent.data后才会返回数组内容。#parent在jsrender叫路径访问,但是我觉得这里叫向上迭代还要好些。

jsrender条件

{{if  fullprice}}
    html markup
{{else halfprice}}
    html markup
{{else}}
    html markup
{{/if}}

 也可以吧他们扯开用,如:{{if fullprice}}html markup{{/if}}和{{if fullprice}}html markup{{else}}html markup{{/if}}。但是这里需要注意两点:

  1、if....else....else表示了if elseif else,这里的else表示了elseif。

  2、{{if  fullprice}}中的fullprice条件表达式表示的是fullprice不为空。其实还可以有更懂的条件表达式可以应用到这里来,如下(注意这里的等于和不等于、、、、):

表达式 举例 注释
|| {{ :a || b }}
&& {{ :a && b }}
! {{ :!a }}
<= 和>=和 <和 > {{ :a <= b }} 比较
=== 和 !== {{ :a === b }} 等于和不等于

  3、在条件表达式中还可以用一些属性进行比较,如{{if  xxx.length > 50}}等等

jsrender模板嵌套

    在上面一个例子中,嵌套了两个for循环,试想一下,如果这两个for循环结构非常复杂或其下还要嵌套一个甚至多个for循环的时候,上面所说的jsrender提高了代码的可见性和可维护性就不复存在了。于是jsrender也提供了jsrender模板的嵌套,改写一下上上面的JsRender模板:

<script type="text/x-jsrender" id="studentTemplate">
    {{for #data}}
        <h3>{{:name}}</h3>
        <ul>
        {{for language tmpl="#studentLanguageTemplate" /}}
        </ul>
    {{/for}}
</script>

<script type="text/x-jsrender" id="studentLanguageTemplate">
    <li> {{:#parent.parent.data.name}} is learning {{:title}}</li>
</script>
//render
$("#studentList").html($("#studentTemplate").render(studnets));
这样就可以避免无限的嵌套下去,只需要设置{{for}}的tmpl属性即可。这时,tmpl是一个脚本标记。如果 studentLanguageTemplate已经被$.templates()编译,那么也可以这么写:

<script type="text/x-jsrender" id="studentTemplate">
    {{for #data}}
        <h3>{{:name}}</h3>
        <ul>
        {{for language tmpl="studentLanguageTemplate" /}}
        </ul>
    {{/for}}
</script>

<script type="text/x-jsrender" id="studentLanguageTemplate">
    <li> {{:#parent.parent.data.name}} is learning {{:title}}</li>
</script>
//render
$.templates("studentLanguageTemplate", "#studentLanguageTemplate");
$("#studentList").html($("#studentTemplate").render(studnets));

上面的templ不再“#XXX”指向一个脚本标记,而是"XXX"指向一个已经标记的脚本标记。不过除了着了,Jsrender还具备良好的可扩展性。


转载于:https://my.oschina.net/jgy/blog/125906

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jQuery是一个快速、简洁的JavaScript库,提供了许多简化DOM操作、处理事件、创建动画和处理AJAX等常见任务的功能。它简化了JavaScript代码的编写,使开发人员能够更轻松地操作HTML文档。 一些jQuery的主要特点包括: - 选择器:jQuery提供了强大的选择器,使开发人员能够轻松地选取和操作HTML元素。 - DOM操作:jQuery提供了简化DOM操作的方法,如添加、删除、修改元素,改变样式等。 - 事件处理:jQuery提供了处理事件的方法,如点击、鼠标移动等,以及绑定和解绑事件处理程序。 - AJAX支持:jQuery提供了简化AJAX请求的方法,使开发人员能够轻松地进行异步数据交互。 - 动画效果:jQuery提供了丰富的动画效果,如淡入淡出、滑动、渐变等,以及自定义动画效果的功能。 - 插件支持:jQuery有大量的插件可用于扩展其功能,开发人员可以根据需要选择合适的插件来增强功能。 而jsRender是一个基于jQuery的模板引擎,用于生成HTML片段。它提供了一种简单而强大的方式来将数据与模板结合,生成动态的HTML内容。jsRender使用类似于Mustache的语法,通过{{}}标记来表示模板中的数据绑定和逻辑处理。 使用jsRender,您可以通过定义模板和提供数据,将数据动态地渲染到HTML页面中。它支持条件语句、循环语句、过滤器等功能,使您能够更灵活地控制生成的HTML内容。 总结起来,jQuery是一个功能强大的JavaScript库,用于简化DOM操作、处理事件、创建动画和处理AJAX等任务。而jsRender是基于jQuery的模板引擎,用于生成动态的HTML内容。它们可以一起使用来提高开发效率并创建交互丰富的网页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值