2012-03-22 15 views
12

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) 

Respuesta

22

Yo diría, si necesita una evaluación demorada ación, entonces probablemente deberían definirse como funciones.

Quizás tomando los valores de forma individual:

templates: 
    list: (foo) -> "<ul class='#{ foo }'></ul>" 
    listItem: (foo, bar) -> "<li>#{ foo + bar }</li>" 

o de un objeto de contexto:

templates: 
    list: (context) -> "<ul class='#{ context.foo }'></ul>" 
    listItem: (context) -> "<li>#{ context.foo + context.bar }</li>" 

dado a su ahora ex comentarios, usted podría utilizar el segundo ejemplo anterior, así:

$(options.templates.listItem foo: "foo", bar: "bar").appendTo 'body' 
+0

Gracias por las sugerencias. – Adam

+0

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

+0

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

Cuestiones relacionadas