js模板 arttemplate 讓數據與html分離


js模板引擎

前后交互過程中最麻煩的就是如何將json數據展示到頁面中,循環拼接html的方法實在是太low了,飽受其苦,BAT同樣會遇到這樣的問題,於是乎就有個各自的js模板引擎,目的只有一個:讓數據更快的呈現,頁面更早的渲染。

這里比人做過比較http://www.cnblogs.com/guohu/p/3870677.html,騰訊的arttemplate有絕對性優勢,那么我們就簡單粗暴的選它了。

Tencent arttemplate使用

這里有官方的詳細文檔:騰訊arttemplate
語法介紹,分原生語法和簡潔語法

arttemplate-native.js web版下載

tornado的模板語法和簡潔語法沖突了,我去,那就用原生語法吧,最后已經配置成這個鳥樣子了

template.config('openTag','<@');
template.config('closeTag','@>');
<script type="text/html" id="tmp_msg">
<@ for(var i=0; i < 5; i++){ @>
    <div class="col-md-12 clearfix" style="margin-top:5px;padding-bottom: 5px;border-bottom: 0.5px solid #ccc;">
        <div class="col-sm-2"><img src="/static/img/user.png" width="60px" height="60px" alt=""></div>
        <div class="col-sm-6">這是一個美國人發的測試消息</div>
        <div class="col-sm-2">2017-2-13 9:12</div>
        <div class="col-sm-2">
            <input type="checkbox">
        </div>
    </div>
<@}@>
</script>

一個bug

第一次用就碰到了個奇怪的事情,在調用template時總是沒有輸出

var html = template(tmpName, resp);
$('#' + tabName).html(html);

加上了對resp的判斷之后就可以了,這是為什么?

if (resp.data && resp.data.length > 0) {
    var html = template(tmpName, resp);
    $('#' + tabName).html(html);
}

自定義配置

方法

基本用法


<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>basic-demo</title>
<script src="../../dist/template-native.js"></script>
</head>

<body>
<div id="content"></div>
<script id="test" type="text/html">
<% if (isAdmin) { %>

<h1><%=title%></h1>
<ul>
    <% for (var i = 0; i < list.length; i ++) { %>
        <li>索引 <%= i + 1 %> :<%= list[i] %></li>
    <% } %>
</ul>

<% } %>
</script>

<script>
var data = {
	title: '基本例子',
	isAdmin: true,
	list: ['文藝', '博客', '攝影', '電影', '民謠', '旅行', '吉他']
};
var html = template('test', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html>

在javascript中存放模板

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>compile-demo</title>
<script src="../../dist/template-native.js"></script>
</head>

<body>
<h1>在javascript中存放模板</h1>
<div id="content"></div>
<script>
var source = '<ul>'
+    '<% for (var i = 0; i < list.length; i ++) { %>'
+        '<li>索引 <%= i + 1 %> :<%= list[i] %></li>'
+    '<% } %>'
+ '</ul>';

var render = template.compile(source);
var html = render({
    list: ['攝影', '電影', '民謠', '旅行', '吉他']
});

document.getElementById('content').innerHTML = html;
</script>
</body>
</html>

顯示html


<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>no escape-demo</title>
<script src="../../dist/template-native.js"></script>
</head>

<body>
    <h1>不轉義HTML</h1>
    <div id="content"></div>
    <script id="test" type="text/html">
    <p>不轉義:<%=#value%></p>
    <p>默認轉義: <%=value%></p>
    </script>

    <script>
    var data = {
        value: '<span style="color:#F00">hello world!</span>'
    };
    var html = template('test', data);
    document.getElementById('content').innerHTML = html;
    </script>
</body>
</html>

嵌入子模板


<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>include-demo</title>
<script src="../../dist/template-native.js"></script>
</head>

<body>
<div id="content"></div>
<script id="test" type="text/html">
<h1><%=title%></h1>
<%include('list')%>
</script>
<script id="list" type="text/html">
<ul>
    <% for (var i = 0; i < list.length; i ++) { %>
        <li>索引 <%= i + 1 %> :<%= list[i] %></li>
    <% } %>
</ul>
</script>

<script>
var data = {
	title: '嵌入子模板',
	list: ['文藝', '博客', '攝影', '電影', '民謠', '旅行', '吉他']
};
var html = template('test', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html>

自定義方法


<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>helper-demo</title>
<script src="../../dist/template-native.js"></script>
</head>

<body>
<h1>輔助方法</h1>
<div id="content"></div>
<script id="test" type="text/html">
<%=dateFormat(time, 'yyyy<b>年</b> MM月 dd日 hh:mm:ss')%>
</script>

<script>
/** 
 * 對日期進行格式化, 
 * @param date 要格式化的日期 
 * @param format 進行格式化的模式字符串
 *     支持的模式字母有: 
 *     y:年, 
 *     M:年中的月份(1-12), 
 *     d:月份中的天(1-31), 
 *     h:小時(0-23), 
 *     m:分(0-59), 
 *     s:秒(0-59), 
 *     S:毫秒(0-999),
 *     q:季度(1-4)
 * @return String
 * @author yanis.wang
 * @see	http://yaniswang.com/frontend/2013/02/16/dateformat-performance/
 */
template.helper('dateFormat', function (date, format) {

    date = new Date(date);

    var map = {
        "M": date.getMonth() + 1, //月份 
        "d": date.getDate(), //日 
        "h": date.getHours(), //小時 
        "m": date.getMinutes(), //分 
        "s": date.getSeconds(), //秒 
        "q": Math.floor((date.getMonth() + 3) / 3), //季度 
        "S": date.getMilliseconds() //毫秒 
    };
    format = format.replace(/([yMdhmsqS])+/g, function(all, t){
        var v = map[t];
        if(v !== undefined){
            if(all.length > 1){
                v = '0' + v;
                v = v.substr(v.length-2);
            }
            return v;
        }
        else if(t === 'y'){
            return (date.getFullYear() + '').substr(4 - all.length);
        }
        return all;
    });
    return format;
});

// --------

var data = {
	time: (new Date).toString(),
};
var html = template('test', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM