2012-03-22 10 views
12

मैं एक विकल्प मेरी सीएस कक्षा में आपत्ति है, और मुझे इसमें कुछ टेम्पलेट्स रखना चाहते हैं:कॉफीस्क्रिप्ट में, संकलित होने के बजाए रन-टाइम पर स्ट्रिंग को इंटरपोल करने का कोई 'आधिकारिक' तरीका है?

class MyClass 
    options: 
     templates: 
      list: "<ul class='#{ foo }'></ul>" 
      listItem: "<li>#{ foo + bar }</li>" 
      # etc... 

तो मैं इन तार बाद में कोड में को जोड़ करना चाहते हैं ... लेकिन बेशक इन्हें "<ul class='" + foo +"'></ul>" पर संकलित किया गया है, और foo अपरिभाषित है।

क्या .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) 

उत्तर

22

मैं कहूंगा, अगर आपको देरी से मूल्यांकन की आवश्यकता है आयन, तो उन्हें शायद कार्यों के रूप में परिभाषित किया जाना चाहिए।

शायद मूल्यों को व्यक्तिगत रूप से ले रही है:

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

या एक संदर्भ वस्तु से:

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

अपने अब-पूर्व टिप्पणियों को देखते हुए, तुम इतनी तरह से ऊपर 2 उदाहरण इस्तेमाल कर सकते हैं:

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

सुझावों के लिए धन्यवाद। – Adam

+0

अद्यतन के लिए फिर से धन्यवाद। आपका समाधान मेरी 'स्ट्रिंग :: इंटरप' चीज़ की तुलना में थोड़ा क्लीनर दिखता है। क्या आपका रास्ता भी बेहतर प्रदर्शन करेगा क्योंकि यह रेगेक्स का उपयोग नहीं करता है या यह एक गैर-मुद्दा है? मैं इसे बहुत बड़े लूप में कर रहा हूं। – Adam

+0

किसी और के लिए जो यह उपयोगी पा सकता है, जोनाथन की विधि मेरी तुलना में काफी बेहतर प्रदर्शन करती है: http://jsperf.com/string-concat-vs-regex-replace – Adam