關於artTemplate使用的一點小心得
阿新 • • 發佈:2019-02-12
artTemplate(點選開啟連結)是一個Javascript模板引擎。用模板才渲染ajax請求獲得的資料 ,要比用一些操作dom的JsApi優雅一些。效能應該也好很多。
然而我發現使用模板進行一些分支或判斷的時候,往往會使模板看起來比較混亂。
例如有如下資料 [ {name:'aaa',status:1} ,{name:'bbb',status:0} ....]
按照官網的示例,模板需要這麼寫
<span style="white-space:pre"> </span><script type="text/html" id="test-ugly-tpl"> {{each com as value index}} <span>{{value.name}}</span> {{if value.status==1}} <p>正常</p> {{else}} <p>異常</p> {{/if}} {{/each}} </script>
這還是比較簡單的情況,實際使用中可能有多處分支,巢狀分支的情況。
雖然官網上沒有寫,但是經過本人的試驗,發現artTemplate的語法是支援三目運算的
於是可以改進成下列程式碼
<span style="white-space:pre"> </span><script type="text/html" id="test-ok-tpl"> {{each com as value index}} <span>{{value.name}}</span> <p>{{value.status==1?"正常":"異常"}}</p> {{/each}} </script>
這樣一定程度上使程式碼的可讀性變好了,但是如果是3種或以上的分支,巢狀三目運算又會影響程式碼的工整性。
於是我想為什麼不把資料整理好,再進行模板渲染呢?如
<span style="white-space:pre"> </span>for(var i in data){
if(data[i].status==1){
data[i].statusText="正常";
}else{
data[i].statusText="異常";
}
}
那麼模板寫起來就簡單多了, 也實現了運算邏輯與檢視的分離
<span style="white-space:pre"> </span><script type="text/html" id="test-pretty-tpl">
{{each com as value index}}
<span>{{value.name}}</span>
<p>{{value.statusText}}</p>
{{/each}}
</script>
但是這樣做,在渲染時進行了一次遍歷操作,渲染中又進行了一次遍歷,可能會使效率變差麼?
經過實驗,發現用第一種方式渲染300條資料,5-6納秒。第二種和第三種為2-3納秒。
測試程式碼如下:
由此可見,雖然多進行了一次遍歷。但渲染遍歷的時候工作減少了,效率反而提升了。
所以我推薦在開發過程中,現將需要渲染的資料進行初步的整理,在進行模板渲染的工作。
<span style="white-space:pre"> </span>$(function(){
var data ;
$.post(
"someurl",
someParam,
function(res){
data=res.data;
renderUgly(data);
renderOk(data);
renderPretty(data);
}
);
function renderUgly(data){
var start = new Date().getTime();
$('#ugly').html(template('test-ugly-tpl',{com:data}));
var end = new Date().getTime();
console.log("render using ugly:"+(end-start));
}
function renderOk(data){
var start = new Date().getTime();
$('#ok').html(template('test-ok-tpl',{com:data}));
var end = new Date().getTime();
console.log("render using ok:"+(end-start));
}
function renderPretty(data){
var start = new Date().getTime();
for(var i in data){
if(data[i].status==1){
data[i].statusText="正常";
}else{
data[i].statusText="異常";
}
}
$('#pretty').html(template('test-pretty-tpl',{com:data}));
var end = new Date().getTime();
console.log("render using pretty:"+(end-start));
}
});