Underscore.js模板渲染

时间:2011-11-19 18:02:32

标签: javascript backbone.js underscore.js underscore.js-templating

我有这个示例代码,使用下划线模板渲染简单的unescapedHTML。

var template = $(this.el).html(_.template(this.template, {'data': '<script>'}));
$(this.parent).append(template);

但是当它尝试渲染它时,它会导致错误:

  

未捕获的TypeError:对象[object Object]没有方法'replace'

任何人都可以请您告诉我原因是什么以及如何解决?因为在下划线文档中:

var template = _.template("<b>&lt;%- value %></b>");
template({value : '&lt;script&gt;'});
=> "<b>&lt;script&gt;</b>"

提前致谢。

2 个答案:

答案 0 :(得分:27)

来自fine manual

  

模板 _.template(templateString, [context])

     

将JavaScript模板编译为可以评估渲染的函数。

_.template的第一个参数应该是一个字符串,而不是一个jQuery对象。 _.template的部分内部处理调用String#replace函数,这就是您的错误来源。您可能想要使用它:

var template = $(this.el).html(_.template(this.template.html(), {'data': '<script>'}));
$(this.parent).append(template);

演示:http://jsfiddle.net/ambiguous/wPu6G/

你给出的例子很好用:

  

http://jsfiddle.net/ambiguous/w2qWe/

所以我不知道'value'未定义的位置您在评论中提到的错误可能来自。

答案 1 :(得分:1)

我在服务器上运行节点时遇到了同样的错误。如果您从磁盘读取模板文件而您没有指定编码,则node.js将返回一个缓冲区。错误基本相同,因为Underscore需要一个字符串。确保指定编码,以便将字符串传递给Underscore。

这会产生错误。

var template = _.template(fs.readFileSync('mytemplate.tpl'));

这很好。

var template = _.template(fs.readFileSync('mytemplate.tpl', { 'encoding':'utf8'}));