Ответ 1
Исправление по состоянию на апрель 2012 года: Underscore 1.3.2 (9 апреля 2012 г.) внесли изменения в _.template()
, проверьте changelog и источник, так как могут возникнуть осложнения, которые были описаны здесь.
Да и нет - шаблон сначала переводится в строку кода Javascript и выполняется как один блок кода, поэтому, если вы ищете синтаксическую ошибку, вы должны удалить код нарушения из шаблон, который вы пытаетесь выполнить.
Но если это что-то еще, вложение a <% return __p.join(''); %>
нарушит выполнение и вернет результат шаблона до этой точки (прочитайте источник, чтобы узнать, почему, но по существу, результаты блоков шаблонов помещаются в массив с именем __p
один за другим).
Вы также можете выполнять регистрацию во время оценки вашего шаблона (т.е. поместите <% console.log(<..>) %>
в свой шаблон, чтобы увидеть диагностику. Для более сложного устранения неполадок вы также можете поместить <% debugger; %>
в свой код шаблона в свой любимый отладчик. код, который вы увидите, будет недружелюбным для чтения, у вас будет доступ к области оценочных шаблонов.
Если бы я выполнял обширную работу и нуждался в более широких средствах отладки, я бы, вероятно, взял копию underscore.js
script и добавил код диагностики для самой функции _.template()
. Например:
_.template = function(str, data) {
var c = _.templateSettings;
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
'with(obj||{}){__p.push(\'' +
str.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(c.interpolate, function(match, code) {
return "'," + code.replace(/\\'/g, "'") + ",'";
})
.replace(c.evaluate || null, function(match, code) {
return "');" + code.replace(/\\'/g, "'")
.replace(/[\r\n\t]/g, ' ') + "__p.push('";
})
.replace(/\r/g, '\\r')
.replace(/\n/g, '\\n')
.replace(/\t/g, '\\t')
+ "');}return __p.join('');";
console.log(tmpl.replace(/;/g, '\n')); // <- dump compiled code to console before evaluating
var func = new Function('obj', tmpl);
return data ? func(data) : func;
};