erratas como de Abr 2012:subrayado 1.3.2 (9 de abril de 2012) han introducido cambios a _.template()
, active la changelog y la fuente ya que las complicaciones a lo que se ha descrito aquí podría haber aparecido.
Sí y no: la plantilla se traduce primero a una cadena de código JavaScript (difícil de leer) y se ejecuta como un bloque de código, por lo que si está buscando un error de sintaxis debe eliminar el código ofensivo de la plantilla que intentas ejecutar
Pero si que es otra cosa, la incorporación de un <% return __p.join(''); %>
romperá ejecución y devolver el resultado de la plantilla hasta ese momento (leer la fuente para ver por qué, pero en esencia, los resultados de los bloques de la plantilla se ponen en una matriz llamada __p
Uno después del otro).
También se puede hacer el registro, mientras que sus evalúa plantilla (es decir, ponen <% console.log(<..>) %>
en su plantilla para ver el diagnóstico. Para solucionar problemas más avanzados, también se puede poner un <% debugger; %>
en su código de plantilla para caer en el depurador favorito. A pesar de que el código que Verá será hostil leer tendrá acceso al alcance de las plantillas de evaluación.
Si estuviera haciendo un trabajo extenso y necesitara instalaciones de depuración más extensas, probablemente tomaría una copia del script underscore.js
y agregaría algún diagnóstico código de soporte para la función _.template()
. Por ejemplo:
_.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;
};
Gracias, cubriste algunos buenos enfoques y definitivamente te ayudarán en la depuración.
Sería genial si hubiera un proceso más lento pero más fácil de depurar que la plantilla podría ejecutarse. Valdría la pena poder obtener la capacidad de tener el mismo tipo de errores que veo en php.
Supongo que para hacerlo, debería contar las líneas entre los bloques de código, y mantener algún tipo de incremento interno. – RobKohr