Создание шаблона 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><%- value %></b>");
template({value : '<script>'});
=> "<b><script></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'}));