12
我有一個選項在我的CS類的對象,我想保留一些模板是:在CoffeeScript中,是否有'官方'的方式來在運行時插入字符串而不是編譯時?
class MyClass
options:
templates:
list: "<ul class='#{ foo }'></ul>"
listItem: "<li>#{ foo + bar }</li>"
# etc...
那我想插這些字符串在後面的代碼 ...但是當然這些編譯爲"<ul class='" + foo +"'></ul>"
,而foo是未定義的。
是否有官方的CoffeeScript方式在運行時使用.replace()
來做到這一點?
編輯:我最後寫一個小工具,以幫助:
# interpolate a string to replace {{ placeholder }} keys with passed object values
String::interp = (values)->
@replace /{{ (\w*) }}/g,
(ph, key)->
values[key] or ''
所以我選擇現在的樣子:
templates:
list: '<ul class="{{ foo }}"></ul>'
listItem: '<li>{{ baz }}</li>'
然後在後面的代碼:
template = @options.templates.listItem.interp
baz: foo + bar
myList.append $(template)
感謝您的建議。 – Adam 2012-03-22 20:38:02
再次感謝您的更新。你的解決方案看起來比我的'String :: interp'更乾淨。您的方式也會更好地執行,因爲它不使用正則表達式或是一個非問題?我可能會在非常大的循環中做到這一點。 – Adam 2012-03-23 02:15:16
對於任何可能會覺得這個有用的人來說,喬納森的方法比我的執行得更好:http://jsperf.com/string-concat-vs-regex-replace – Adam 2012-03-26 23:40:25