Создание шаблона Underscore.js

У меня есть этот пример кода для рендеринга простого unescapedHTML с использованием шаблона подчеркивания.

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

Но когда он пытается отобразить его, это вызвало ошибку:

Uncaught TypeError: Object [object Object] не имеет метода 'replace'

Может кто-нибудь, пожалуйста, просветит меня, в чем причина и как ее решить? Так как в документации подчеркивания:

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

Спасибо заранее.

Ответ 1

Из точное руководство:

шаблон _.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/

Итак, я не знаю, где "значение" не определено. Ошибка, о которой вы упоминаете в своем комментарии, может появиться.

Ответ 2

Я просто ударил ту же ошибку при запуске node на сервере. Если вы читаете файл шаблона с диска и не указываете кодировку, то node.js вернет буфер. Ошибка в основном такая же, потому что Underscore ожидает строку. Убедитесь, что вы указали кодировку, чтобы передать строку в Underscore.

это приведет к ошибке.

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

и это хорошо.

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