underscore.js 预编译模板使用

Posted

技术标签:

【中文标题】underscore.js 预编译模板使用【英文标题】:underscore.js precompiled templates using 【发布时间】:2013-09-12 04:16:47 【问题描述】:

我想使用预编译的 underscore.js 模板。我使用_.template().source 并将结果保存在文件中。但我不明白,如何使用这个模板。预编译的模板是字符串,我不能将它转换为函数。我尝试使用eval,但它总是返回解析错误。

例如:

<div>
    <% for(var i = 0; i < 5; i++) %>
        <div><%=i%></div>
    <%  %>
</div>

标准使用:

_.template(tpl).();

结果:

<div>

    <div>0</div>

    <div>1</div>

    <div>2</div>

    <div>3</div>

    <div>4</div>

</div>

预编译:

_.template(tpl).source

预编译模板:

"function(obj)
var __t,__p='',__j=Array.prototype.join,print=function()__p+=__j.call(arguments,'');;
with(obj||)
__p+='<div>\n\t';
 for(var i = 0; i < 5; i++) 
__p+='\n\t\t<div>'+
((__t=(i))==null?'':__t)+
'</div>\n\t';
  
__p+='\n</div>\n';

return __p;
"

运行预编译模板:

var a = eval(tplc);
a();

错误:

Error
line: 1
message: "Parse error"
sourceId: 139746789246216
__proto__: SyntaxError

【问题讨论】:

【参考方案1】:

是的,source 属性将编译后的模板作为字符串返回。您可以将该字符串写入定义 javascript 对象文字的文件,如下所示:

window.JST =  ;
JST.some_name = function(obj) ... ;
// The rest of the compiled template functions go here

然后,像任何其他 JavaScript 文件一样将其加载到浏览器中,您最终会在 JST 中得到一堆已编译的模板函数:

var html = JST.some_name(data);

当然,您可以随意构建JST 定义,这只是说明整体方法的一种简单方式。

请记住,字符串是否只是一些要像任何其他文本块一样被操作的文本(例如将其写入文件)或者它是否是 JavaScript 源代码取决于谁在解释该字符串。

【讨论】:

【参考方案2】:

我终于找到了this 的解决方案。我不能说这是一个优雅的解决方案,但它确实有效。 以我为例:

var a = eval('[' + tplc + ']')[0];
a();

【讨论】:

eval 永远不是答案。 有些人在遇到问题时会想“我知道,我会使用 eval”。现在他们有两个问题,五个安全问题和一个无法调试的混乱。

以上是关于underscore.js 预编译模板使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在underscore.js模板中使用if语句?

模板引擎原理及underscore.js使用

加载 ASP.NET 网页时缺少 Underscore.js 的 Javascript“.map”文件 [重复]

Underscore.js 的模板功能介绍与应用

HiShop2.x版本中的上传插件分析,得出所用的模板语言为Underscore.js 1.6.0且自己已修改

underscore js:更智能的列表渲染与每个或替代