Визуализация шаблона Underscore.js - PullRequest
11 голосов
/ 19 ноября 2011

У меня есть этот пример кода для рендеринга простого 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>"

Заранее спасибо.

Ответы [ 2 ]

27 голосов
/ 20 ноября 2011

Из подробного руководства :

template _.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/

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

1 голос
/ 03 апреля 2014

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

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

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

, и это хорошо.

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