JsRender 前端渲染模板常用API学习

JsRender 常用API

1. $.templates()

$.templates()方法是用来注册或编译模板的,使用的情况有以下几种。

  • 把html字符串编译编译成模板
  • 获取使用script标签声明的模板,并返回一个模板对象
  • 把html字符串或者在script标签中声明的模板注册成命名模板
  • 获取之前就存在的命名模板
  • 在nodejs中,根据文件路径获取一个模板对象

我们正常使用的方式就是使用$.templates()方法把html字符串编译成模板,返回一个模板对象,然后调用该对象的render方法并传入数据,就可以得到一份完整的html字符串代码。比如:

 <div id="result"></div><script>var info = {name: 'van',age: 18};//获取模板var jsRenderTpl = $.templates('<div><h3>{{:name}}</h3><p>{{:age}}</p></div');//模板与数据结合var html = jsRenderTpl.render(info);//也可以这样用//var html = jsRenderTpl(info);
        $("#result").html(html);</script>

或者我们也可以给模板定义一个名称

//定义一个命名模板
$.templates('myPersonalInfoTpl', '<div><h3>{{:name}}</h3><p>{{:age}}</p></div');
//模板与数据结合
var html = $.render.myPersonalInfoTpl(info);

当然,我们也可以把html字符串单独写在script标签中,然后根据id来获取

 <div id="result"></div><script type="text/x-jsrender" id="tmp"><div><h3>{{:name}}</h3><p>{{:age}}</p></div></script><script>var info = {name: 'van',age: 18};//定义一个命名模板
        $.templates('myPersonalInfoTpl', '#tmp');//模板与数据结合var html = $.render.myPersonalInfoTpl(info);$('#result').html(html);</script>

更想当然,还可以在一个templates()方法里面注册多个命名模板

<div id="result"></div><script type="text/x-jsrender" id="tmp"><div><h3>{{:name}}</h3><p>{{:age}}</p></div></script><script>var info = {name: 'van',age: 18};//定义一个命名模板
        $.templates({'myPersonalInfoTpl': '#tmp','externalTpl': '<p>this is externalTpl</p>'});//模板与数据结合var finalTpl = $.render.myPersonalInfoTpl(info);var externalTpl = $.render.externalTpl();$('#result').html(finalTpl).append(externalTpl);</script>

还可以指定一些只供这个模板使用的一些方法

 <div id="result"></div><script type="text/x-jsrender" id="tml"><div><h3>{{upper:~append(name, ' wu')}}</h3><p>{{:age}}</p></div></script><script>var info = {name: 'van',age: 18};//定义一个命名模板,并指定只供这个模板使用的转换方法与辅助方法
        $.templates("myPersonalInfoTpl", {markup: "#tml",converters: {upper: function (val) {return val.toUpperCase();}},helpers: {append: function (a, b) {return a + b;}}});//模板与数据结合var finalTpl = $.render.myPersonalInfoTpl(info);$('#result').html(finalTpl);</script>

2、渲染模板的render()方法

当我们使用$.templates()方法注册一个模板对象时,最后还是需要把模板对象跟数据结合得到最终的html字符串的,render()的使用方式有以下三种。
当模板对象myPersonalTpl是使用$.templates()注册的模板时,只能使用myPersonalTpl.render(data)的方式来渲染模板
  //定义一个匿名模板var myPersonalTpl = $.templates("#tml");//模板与数据结合var finalTpl = myPersonalTpl(info);

当模板对象myPersonalTpl是以命名模板的方式注册时,需要使用$.render.myPersonalTpl(data)或者$.render['myPersonalTpl'](data)的方式来渲染模板

//定义一个命名模板
$.templates("myPersonalInfoTpl","#tml");
//模板与数据结合
var finalTpl = $.render.myPersonalInfoTpl(info);

当使用jQuery、并且模板是在script标签中声明时,还可以直接使用$("#personTemplate").render(data),并不需要调用$.templates()方法来注册模板。

var myHelpers = {upper: function(val){return val.toUpperCase();}}//使用jQuery选择器获取script标签声明的jsrender模板,并传入数据跟一些方法渲染模板。var html = $("#tml").render(data, myHelpers);$('select').html(html);
3、 使用$.views.helpers()方法注册辅助函数
当我们拿到的数据跟页面显示的数据有差别、或者是我们需要把原数据转化成其他格式的数据时,我们使用一些辅助函数来实现,jsrender提供了两种方式,一种是helper函数,一种是converters转换器。我们先讲辅助函数helper。helper方法是以 "~" 为前缀作为方法的标识,在加上方法名,然后把值当参数传进去
//example
{{:~myHelperValue}}
{{:~myHelperFunction(name, title)}}
{{for ~myHelperObject.mySortFunction(people, "increasing")}} ... {{/for}}

辅助函数helper注册方式有以下三种:

  • 使用$.views.helpers()注册全局的helper方法。
    当我们需要一些比较通用的方法时,可以提取出来写到公用的js文件中去,以后就不用重新写一遍了。
// 定义全局的helper方法
        $.views.helpers({concat: function(first , last){return first + '  ' + last;},util: {prefix: 'age is  ',addPrefix: function(age){return this.prefix + age;}}});
  • 写局部的辅助方法
    当我们的某一个页面有多处使用一个辅助方法,但是又不够通用,不必写到common文件去时,我们可以写只供这个页面使用的辅助方法。
// 定义局部的helper方法var myHelper = {concat: function(first , last){return first + '  ' + last;},util: {prefix: 'age is  ',addPrefix: function(age){return this.prefix + age;}}}//并在渲染模板的时候把myHelper当做参数传进去var html = $('#tml').render(data, myHelper);
  • 只给特定的模板写辅助函数,其实也就是在定义模板的时候把helper传进去
//注册一个命名模板,并指定helper方法
        $.templates({myPersonInfo: {markup: '#tml',helpers: {concat: function(first , last){return first + '  ' + last;},util: {prefix: 'age is  ',addPrefix: function(age){return this.prefix + age;}}}}});//渲染模板,命名模板只能使用$.render调用var html = $.render.myPersonInfo(data);$('#box').html(html);

4、使用$.views.converters()注册转换器

在jsrender中,转换器主要是方便对数据或表达式的的结果进行处理或者格式化,jsrender本身自带了三个转换器,比如:
{{html:'<b>bolin</b>'}} //- 对html标签进行编码,原样输出 :<b>bolin</b>
{{>'<b>bolin</b>'}} //同上,html的别名
{{url:"<_>_\"_'"}} // 对特殊字符进行编码 基本是 <,>,",'...    :%3C_%3E_%22_'
{{attr:value}} //对标签的属性值进行编码,也是字符的转换

当然,仅仅是这三个转换时不够用的,jsrender提供了自定义转换器的方法。$.views.converters()。比如我想要定义一个时间格式化的转换器跟大小写转换的转换器。

 <div id="result"></div><script type="text/x-jsrender" id="myPersonInfo"><h3>{{upper: 'my name is ' + name}}</h3><p>now is {{dateFormat: time}}</p></script><script>var data = {name: 'van',time: new Date()};//注册全局转化器
        $.views.converters({dateFormat: function (val) {var time = new Date();   return (time.getMonth() + 1) + '' + time.getDate() + '';},upper: function (val) {return val.toUpperCase();}});//渲染模板,命名模板只能使用$.render调用var html = $('#myPersonInfo').render(data);$('#result').html(html);</script>

你会发现,其实转换器跟辅助函数差不多,只是使用的方法不一样而已。虽然实现都差不多,但还是有点区别的,转换器也分全局定义跟局部定义,局部定义的转换只要把模板当做参数传进去就好了,所定义的转换器只能在此模板中生效。

 //注册局部转换器,指定myPersonInfo模板可用
        $.views.converters({dateFormat: function (val) {var time = new Date();return (time.getMonth() + 1) + '月' + time.getDate() + '日';},upper: function (val) {console.log(val);return val.toUpperCase();}}, $.templates('#tml'));

除了使用在{{convert:}}标签中之外,还可以在{{if}},{{for}}标签中使用,语法如下:

//if语句
{{if convert='inList' }}...{{/if}}
//for语句
{{for people convert='even'}}...{{/for}}

在其他标签中使用时,只是需要把转化器赋值给convert,当然也可以把辅助方法赋值给convert,比如

{{:name convert=~hlp.bold}}
但是呢,如果你使用{{>name convert=~hlp.bold}}的话,是会报错的,还是老老实实使用辅助方法的形式,除了以上的使用方式之外,convert还提供了一些比较好的功能,比如使用this.tagCxt.props可以获取到标签中定义的属性,使用this.tagCxt.view.data可以获取到标签中所有的变量。
5、使用$.views.tags()注册自定义标签

jsrender 提供了一些内置的标签,但往往是不够用的,所以提供了$.views.tags()方法来定义一些比较灵活的标签。自定义标签比较灵活,能控制、访问的元素也比较多,比如写在该标签里面的args、props、甚至整个view model对象里面的全部数据。使用$.views.tags注册自定义标签的语法有以下四种

  1. $.views.tags('myTag', tagOptions); 当自定义的标签需要要模板与方法时,一般会使用这种方式来注册自定义标签,我们可以在render方法里面处理参数或者属性,然后渲染模板,this.tagCxt对象下,有当前view model的数据供访问
 <div id="result"></div><script type="text/x-jsrender" id="tml">{{myPersonInfo name age addPrefix=false /}}</script><script>var info = {name: 'van',age: 20};$.views.tags({'myPersonInfo': {render: function () {//这里可以获取到自定义标签里面的属性或者参数//可以使用 this.tagCtx.args, this.tagCtx.props, this.tagCtx.view.data 访问 view model里面的任何数据
console.log(this.tagCtx);if (this.tagCtx.props.addPrefix) {return '<h3>Hello, ' + this.tagCtx.args[0] + '</h3><p>' + this.tagCtx.args[1] + '</p>';} else {//使用this.tagCtx.render({name:'lbl'})来渲染定义的模板,并把模板需要的数据传进去return this.tagCtx.render({ name: 'lbl' }) + '<h3>' + this.tagCtx.args[0] + '</h3><p>' + this.tagCtx.args[1] + '</p>';}},template: '<h2>{{:name}}</h2>'}});var html = $('#tml').render(info);$('#result').append(html);</script>

当然,如果我们不需要模板,那么就只定义一个方法就好了。

 $.views.tags('myPersonInfo', function(){                if (this.tagCtx.props.addPrefix) {return '<h3>Hello, ' + this.tagCtx.args[0] + '</h3><p>' + this.tagCtx.args[1] + '</p>';}});

当然,也可能你的自定义标签只需要模板,并不需要方法来处理,那么也是没问题的,当然模板里面也是可以访问各种参数、属性的,只是需要使用~tag.tagCtx对象访问。

<script id="myPersonInfo" type="text/x-jsrender">{{myPersonInfo name age=age /}}</script>$.views.tags('myPersonInfo', {template: '<h3>{{:~tag.tagCtx.args[0]}}</h3><p>{{:~tag.tagCtx.props.age}}</p>'});//也可以这样<script id="myPersonInfo" type="text/x-jsrender">{{myPersonInfo name age addPrefix=false}}<h3>{{:~tag.tagCtx.args[0]}}</h3><p>no info</p>
        {{/myPersonInfo}}</script>//也可以使用tag.tagCtx.content获取到自定义标签中的内容$.views.tags('myPersonInfo', {template: '{{if ~tag.tagCtx.props.addPrefix == true}}\<h3>Hello, {{:~tag.tagCtx.args[0]}}</h3>\<p>{{:~tag.tagCtx.props.age}}</p>\{{else tmpl=~tag.tagCtx.content}}\{{:~tag.tagCtx.content}}\{{/if}}'});//或者这样<script id="teamTemplate" type="text/x-jsrender"><p><b>{{:title}}</b></p><ul>{{range members start=1 end=2}} <li>{{:name}}</li>
        {{/range}}</ul> </script>$.views.tags("range", {template: "{{for ~tag.tagCtx.args[0]}}" +"{{if #index >= ~tag.tagCtx.props.start && #index <= ~tag.tagCtx.props.end}}" +"{{include tmpl=~tag.tagCtx.content/}}" +"{{/if}}" +"{{/for}}"});
View Code

当然也可以为某个模板注册私有的自定义标签

  $.views.tags({myTag1: ...,myTag2: ...}, parentTemplate);

6、使用$.views.settings.debugMode()开启调试模式

当我们使用jsrender写代码时,难免会报一些错,然后直接在控制台抛出错误异常。但是我们想对错误信息做一些处理,比如直接把异常输出到页面,或者自定义错误信息为字符窜,或者抛出错误的时候,先调用函数处理再抛出错误。jsrender提供了$.views.settings.debugMode()传入不同的参数来改变全局抛出异常的情况。

  1. false 内容不会被渲染并且在控制台抛出异常 (默认)
  2. true 抛出的异常会渲染在页面中,在控制台中没有异常抛出
  3. "string" 字符串会替代错误信息渲染在页面中,在控制台没有异常抛出
  4. function 在异常抛出之前,会先经过传入的方法处理,如果此方法没有return,那么就会把错误信息渲染到页面中,如果有return,那么页面中就会渲染return 的信息
$.views.settings.debugMode(function(err){var errMsg = '';if(err){errMsg = 'here has error the err is ' + err;}return errMsg;});

当然,除了为全局处理错误信息之外,也可以使用onError属性为某一个标签定义错误信息,如果你已经在全局设置了处理错误信息的方法,并且传入的参数有返回值(上面提到的3跟4),onError属性是不会起作用的

    {{:address.street onError="Address unavailable"}}{{for phones() onError="<em>No phones</em>"}}{{:address.street onError=name + " has no address"}}{{:address.street onError=~errorMessages(1, name, 'address')}}{{myCustomTag ... onError=""}}$.views.settings.debugMode("this is global err"); //会覆盖上面的onError属性
    or$.views.settings.debugMode(function(err){var errMsg = '';if(err){errMsg = 'here has error the err is ' + err;}return errMsg; //如果return 就会渲染这个,如果不return 就会渲染onError属性的值});

当我们使用render()方法渲染模板的时候,我们想查看某个对象或者某个属性的值,但是并不能在模板中打断点,jsrender提供以下方式在渲染模板的过程中输出对象或者属性的值

{{dbg expression/}}  tag
{{dbg: expression}}   convert
{{:~dbg(expression)}}  helper

以上的三种方式都会把值渲染在页面,并在控制台中输出值,但是呢,如果值是一个对象,那么就会输出字符串,比如

JsRender dbg breakpoint: [object Object]

我们需要看对象里面有什么属性,但是却给我们输出的是字符串,显然不方便调试,所以我们可以重写这个调试标签,让输入值原样输出

//重写dbg调试模式
    $.views.helpers({dbg: function(val){try {console.log(val);return val;}catch (e) {console.log(e);}}});$.views.converters({dbg: function(val){try {console.log(val);return val;}catch (e) {console.log(e);}}});$.views.tags('dbg', function(val){try {console.log(val);return val;}catch (e) {console.log(e);}});

这样重写之后,控制台输出变成这样,就比较方便调试了

Object {name: "bolin", age: 20}

 

参考:https://www.jianshu.com/p/3151d2256410

转载于:https://www.cnblogs.com/vanblog/p/8676881.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

状态图

状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为&#xff0c;显示了该实体如何根据当前所处的状态对不同的事件做出反应。通常我们创建一个UML状态图是为了以下的研究目的&#xff1a;研究类、角色、子系统、或组件的复杂行为。

我身边的手机应用开发者

手机应用火了&#xff0c;我身边的一位朋友(A君)也投身到开发者行列&#xff0c;不过他还算聪明并没有辞掉工作专做手机应用软件开发。 其原因在于他们领导打算做一款自己的应用软件&#xff0c;正当A君愁到底是做IOS平台还是Android平台的时候&#xff0c;领导说&#xff1a;…

学成在线--16.添加课程计划

文章目录一.需求分析二.API接口三.后端1.Dao2.Service3.Controller4.测试四.前端1.页面原型说明1&#xff09;添加按钮2&#xff09;视图部分3&#xff09;在数据模型中添加如下变量4&#xff09;定义表单提交方法和重置方法2.Api调用1&#xff09;定义 api方法2&#xff09;调…

理解 maven 的核心概念

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 本文以类图的方式&#xff0c;介绍 maven 核心的 12 个概念及相互之间的关系。 Table of Contents 1 maven管理的目标&#xff1a;工程…

C#关键字的使用

params object[] 用于函数多参数的定义public static void Write(string format, params object[] arg);explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符。 例如&#xff0c;在下面的示例中&#xff0c;此运算符将名为 Fahrenheit 的类转换为名为 Ce…

maven 中 pom.xml 配置文件标签说明,dependencyManagement和dependencies区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 参考&#xff1a;http://zhaoshijie.iteye.com/blog/2094478http://blog.csdn.net/cpf2016/article/details/45674377 还有一篇转载文章…

学成在线--17.我的课程

文章目录一.需求分析二.API接口三.PageHelper1.PageHelper介绍2.添加依赖3.配置pageHelper四.Dao1.mapper 接口2.mapper.xml映射文件3.测试Dao五.Service六.Controller七.前端1.创建course_list.vue2.路由3.定义API方法4.前端视图course_list.vue详解1&#xff09;API调用--在视…

学成在线--18.新增课程(课程分类查询)

文章目录一.需求分析二.课程分类查询介绍三.数据结构四.数据格式五.数据模型六.Api接口七.服务器端1.Dao1&#xff09;定义mapper2&#xff09;定义mapper映射文件2.Service3.Controller八.接口测试一.需求分析 用户操作流程如下&#xff1a; 1、用户进入“我的课程”页面&…

POI 方式-excle 表格导出实现-java-poi

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 效果&#xff1a; jsp 页面 用的Bootstrap &#xff1a; <li class"dropdown"> <a href"javascript:void(0)…

学成在线--19.新增课程(数据字典)

文章目录一.介绍二.数据模型三.数据模型类四.字典查询API接口五.服务器端1.Dao2.Service3.Controller一.介绍 在新增课程界面需要选择课程等级、课程状态等&#xff0c;这些信息统一采用数据字典管理的方式。 本项目对一些业务的分类配置信息&#xff0c;比如&#xff1a;课程…

程序员的进化

对于很多同学来说&#xff0c;他们对程序员的职业生涯非常关注。而这本质上是一个进化的过程。我们将如何进化&#xff1f;在每个进化阶段我们应该如何提高自己&#xff1f;下面的文章根据我自己的切身经历和阅读过的书&#xff0c;为程序员每个阶段的进化提供了不同的学习思路…

学成在线--20.新增课程(最后完善)

文章目录一.效果展示二.服务端1.Api接口2.Dao3.Service4.Controller三.前端1.页面完善1&#xff09;创建course_add.vue页面2&#xff09;course_add.vue页面路由3&#xff09;course_list.vue中添加链接2.查询数据字典1&#xff09;视图中代码2&#xff09;定义Api方法3&#…

html里面表格问题

表格问题汇总&#xff1a; 现代网站中表格的用武之地已经很少了&#xff0c;但是一些框架&#xff0c;如bootstorp还是会用到的&#xff0c;所以还是需要了解掌握。本随笔只涉及开发过程中遇到的表格问题&#xff0c;不做其他拓展。 1、caption代表的是表格元素的标题。至于标题…

RT-Thread简介

RT-Thread简介 RT-Thread是一款完全由国内团队开发维护的嵌入式实时操作系统&#xff08;RTOS&#xff09;&#xff0c;具有完全的自主知识产权。 经过16个年头的沉淀&#xff0c;伴随着物联网的兴起&#xff0c;它正演变成一个功能强大、组件丰富的物联网操作系统。 RT-Thre…

学成在线--21.课程信息修改

文章目录一.需求分析二.课程管理导航页面1.定义course_manage.vue为课程管理页面2.创建各个信息管理页面3.创建路由三.服务端1.Api接口1&#xff09;根据课程ID查询课程信息2&#xff09;修改课程信息2.Dao3.Service4.Controller四.前端1. 完成course_baseinfo.vue页面2.API方法…

C#曲线分析平台的制作(四,highcharts+ajax加载后台数据)

在上一篇博客&#xff1a;C#曲线分析平台的制作&#xff08;三&#xff0c;三层构架echarts显示&#xff09;中已经完成了后台的三层构架的简单搭建&#xff0c;为实现后面的拓展应用开发和review 改写提供了方便。而在曲线分析平台中&#xff0c;往往有要求时间轴联动功能&…

国际C语言混乱代码大赛结果公布

国际C语言混乱代码大赛&#xff08;IOCCC, The International Obfuscated C Code Contest&#xff09;是一项国际编程赛事&#xff0c;从1984年开始&#xff0c;每年举办一次&#xff08;1997年、1999年、2002年、2003年和2006年例外&#xff09;。目的是写出最有创意的最让人难…

eclipse加速之禁用 JS、jsp 等文件的语法验证

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 去除eclipse的JS验证&#xff1a; 将windows->preference->Java Script->Validator->Errors/Warnings-> Enable Javascr…

学成在线--22.课程营销

文章目录一.需求分析二.数据模型三.服务端1.Api接口1&#xff09;查询课程营销信息2&#xff09;更新课程营销信息2.Dao3.Service4.Controller四.前端1.Api 方法2.编写 course_marketinfo.vue1&#xff09;template2&#xff09;数据对象3&#xff09;保存方法4&#xff09;在m…

电子邮件系统

&#xff08;一&#xff09;电子邮件系统的构成 1.用户代理 用户与电子邮件系统的接口&#xff0c;用户代理使用户能够通过一个很友好的接口来发送和接收邮件&#xff0c;用户代理就是一个运行在PC上的程序。 2 邮件服务器 邮件服务器的功能是发送和接收邮件&#xff0c;同…