13

CS クラスにオプション オブジェクトがあり、その中にいくつかのテンプレートを保持したいと考えています。

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)
4

1 に答える 1

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'
于 2012-03-22T20:08:27.657 に答える