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.pswp.cn/news/452195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452195.shtml
英文地址,請注明出處:http://en.pswp.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;調…

mac 下的操作

nodejs在Mac下的卸載 在 node 官網上下載的安裝包&#xff0c;用安裝包安裝的node.應該可以用一下命令行卸載&#xff1a; 在終端輸入以下命令&#xff1a; sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*} 刪除/usr/local/lib中的…

理解 maven 的核心概念

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 本文以類圖的方式&#xff0c;介紹 maven 核心的 12 個概念及相互之間的關系。 Table of Contents 1 maven管理的目標&#xff1a;工程…

時間跟蹤圖

事件跟蹤圖實質上是擴充的腳本&#xff0c;可以認為事件跟蹤圖是簡化的UML順序圖。

1088. [SCOI2005]掃雷Mine【網格DP】

Description 相信大家都玩過掃雷的游戲。那是在一個n*m的矩陣里面有一些雷&#xff0c;要你根據一些信息找出雷來。萬圣節到了 &#xff0c;“余”人國流行起了一種簡單的掃雷游戲&#xff0c;這個游戲規則和掃雷一樣&#xff0c;如果某個格子沒有雷&#xff0c;那么它里面的數…

spring data jpa和mybatis的不同

使用spring data JPA和mybatis都是用來訪問數據庫&#xff0c;但他們的分工不同&#xff1a; 1.spring data jpa默認使用hibernate作為ORM實現&#xff0c;是spring 提供的一套jpa接口&#xff0c;使用spring data jpa主要完成一些簡單的增刪改查功能。 2.對于復雜的查詢功能會…

函數式編程很難,這正是你要學習它的原因

很奇怪不是&#xff0c;很少有人每天都使用函數式編程語言。如果你用Scala&#xff0c;Haskell&#xff0c;Erlang&#xff0c;F#或某個Lisp方言來編程&#xff0c;很可能沒有公司會花錢聘你。這個行業里的絕大部分人都是使用像Python&#xff0c;Ruby&#xff0c;Java或C#等面…

函數依賴

設R(U)是一個屬性集U上的關系模式&#xff0c;X和Y是U的子集。若對于R(U)的任意一個可能的關系r&#xff0c;r 中不可能存在兩個元組在X上的屬性值相等&#xff0c; 而在Y上的屬性值不等&#xff0c; 則稱“X函數確定Y”或“Y函數依賴于X”&#xff0c;記作X→Y。 X→Y&#x…

Java面試——線程池

1、類比介紹 假如有一個工廠&#xff0c;工廠里面有10個工人&#xff0c;每個工人同時只能做一件任務。 因此只要當10個工人中有工人是空閑的&#xff0c;來了任務就分配給空閑的工人做&#xff1b; 當10個工人都有任務在做時&#xff0c;如果還來了任務&#xff0c;就把任務進…

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調用--在視…

碼是數據系統中的基本概念。所謂碼就是能唯一標識實體的屬性或屬性集合&#xff0c;他是整個實體集的性質&#xff0c;而不是單個實體的性質。 主屬性與非主屬性 包含在任何一個候選碼中的屬性 &#xff0c;稱為主屬性&#xff08;Prime attribute&#xff09;。 不包含在任何…

關于C編程的一點感受

剛畢業的時候用了兩個多月的C語言編程&#xff0c;總的來說對它還是很有感受的&#xff0c;C是一個過程式語言&#xff0c;沒有像C,Java等OOP語言這樣那樣的一系列的規則和限制&#xff1b;它比較靈活&#xff0c;簡潔&#xff0c;高效&#xff1b;這些是給我的印象最深的。這是…

如何打造高效的多任務、高并發的網絡服務器系統?

同一個功能的軟件&#xff0c;不同的團隊&#xff0c;不同工程師去實現&#xff0c;肯定是千差萬別&#xff0c;甚至從根本上完全不同。所以軟件開發在未來很長時間內仍然是一項工匠的手工勞動&#xff0c;尤其像多任務&#xff0c;高并發&#xff0c;偏底層這種對實現技巧比較…

BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(廣義后綴自動機)

題目鏈接 \(Description\) 給定n個模式串&#xff0c;多次詢問一個串在多少個模式串中出現過。(字符集為26個小寫字母) \(Solution\) 對每個詢問串進行匹配最終會達到一個節點&#xff0c;我們需要得到這個節點所代表的子串出現在多少個模式串中。 建立廣義后綴自動機。每次插入…

BigDecimal 加減乘除運算

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 java.math.BigDecimal。BigDecimal一共有4個夠造方法&#xff0c;讓我先來看看其中的兩種用法&#xff1a; 第一種&#xff1a;BigDeci…

主碼 超碼 候選碼

碼是數據系統中的基本概念。所謂碼就是能唯一標識實體的屬性&#xff0c;他是整個實體集的性質&#xff0c;而不是單個實體的性質。它包括超碼&#xff0c;候選碼&#xff0c;主碼。   超碼是一個或多個屬性的集合&#xff0c;這些屬性可以讓我們在一個實體集中唯一地標識一…