Tengo un objeto opciones en mi clase de CS, y me gustaría mantener algunas plantillas en ella:En CoffeeScript, ¿existe una forma "oficial" de interpolar una cadena en tiempo de ejecución en lugar de cuando se compila?
class MyClass
options:
templates:
list: "<ul class='#{ foo }'></ul>"
listItem: "<li>#{ foo + bar }</li>"
# etc...
Entonces me gustaría para interpolar estas cadenas tarde en el código ... Pero por supuesto, estos están compilados en "<ul class='" + foo +"'></ul>"
, y foo no está definido.
¿Existe una manera oficial CoffeeScript hacer esto en tiempo de ejecución utilizando .replace()
?
Edit: terminó escribiendo una pequeña utilidad para ayudar:
# interpolate a string to replace {{ placeholder }} keys with passed object values
String::interp = (values)->
@replace /{{ (\w*) }}/g,
(ph, key)->
values[key] or ''
Así que mis opciones ahora se ven como:
templates:
list: '<ul class="{{ foo }}"></ul>'
listItem: '<li>{{ baz }}</li>'
Y luego más adelante en el código:
template = @options.templates.listItem.interp
baz: foo + bar
myList.append $(template)
Gracias por las sugerencias. – Adam
Gracias de nuevo por la actualización. Su solución parece un poco más limpia que mi cosa 'String :: interp'. ¿Tu forma de actuar también sería mejor porque no usa expresiones regulares o no es un problema? Puedo estar haciendo esto en bucles muy grandes. – Adam
Para cualquier otra persona que pueda resultar útil, el método de Jonathan se comporta mucho mejor que la mía: http://jsperf.com/string-concat-vs-regex-replace – Adam