11

我有这个示例代码可以使用下划线模板呈现简单的 unescapedHTML。

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

但是当它尝试渲染它时,它导致了一个错误:

未捕获的类型错误:对象 [对象对象] 没有“替换”方法

谁能告诉我是什么原因以及如何解决它?由于在下划线文档中:

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

提前致谢。

4

2 回答 2

26

来自精美手册

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

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

for 的第一个参数_.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/

所以我不知道你在评论中提到的“价值”未定义错误可能来自哪里。

于 2011-11-20T02:23:05.417 回答
1

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

这将产生错误。

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

这很好。

var template = _.template(fs.readFileSync('mytemplate.tpl', { 'encoding':'utf8'}));
于 2014-04-03T19:40:52.473 回答