2009-10-01 36 views
1

所以我有一個解決方案,但我想得到一些意見,看看是否有更好的方法來做到這一點。與Rails和Javascript共享模板

我的問題基本上是我列出的數據,將通過RoR加載生成,然後有JS控件來查看子集。我寧願不必支持基本相同的HMTL的兩個版本。所以我的解決辦法是這樣的,我有一個部分是紅寶石看起來是這樣的:

<% value1 = jsmode ? '#{value1}' : object.value1 
value2 = jsmode ? '#{value2}' : object.value2 $> 
<div class="object_template"> 
<div><$= value1 $></div> 
<div><%= value2 %></div> 
</div> 

所以,當我使局部紅寶石,我通過一個false jsmode,它呈現像一個正常部分。然後,我將渲染局部再次用帶有模板ID的div包裝,但這次使用的是真正的jsmode。這將使用#{}字符串呈現html。然後我就可以通過模板爲原型模板對象是這樣的:

new Template($('template')).evaluate({value1: '111', value2: '222'}); 

所以我的問題是,是否有更好的方法來做到這一點?

我知道我可以使用#{}構造將變量傳遞給RoR,如果我用雙引號包裝它們,但我需要#{}來呈現JS模板。

想法?

回答

1

一般方法看起來不錯,實際上可能比我以前在某些情況下做得更好一點。

但是,它看起來像我實際上是將JS版本渲染爲一個div,然後將其傳遞到原型模板。模板也接受一個字符串,所以你可以直接將原始js模板傳遞給它。除非我錯過了一些東西,#template div本身並不是必需的。所以字符串路由可能是更好的方法。

從Rails的話,大概是這個樣子:

<script type="text/javascript"> 
    var raw_template = "#{escape_javascript(render(:partial => 'template', :locals => { :jsmode => true }))}"; 
    var output = new Template(raw_template).evaluate({value1: '111', value2: '222'}); 
    // Do something with the output 
</script> 

escape_javascript使用以下地圖:

JS_ESCAPE_MAP = { 
    '\\' => '\\\\', 
    '</' => '<\/', 
    "\r\n" => '\n', 
    "\n" => '\n', 
    "\r" => '\n', 
    '"'  => '\\"', 
    "'"  => "\\'" } 

這意味着,給你的建議的模板,你應該結束了,結果沿線:

var raw_template = "<div class=\"object_template\">\n<div>#{value1}<\/div>\n<div>#{value2}<\/div>\n<\/div>"; 

哪應該做的很好地訣竅。

+0

這是我想做的一種,但我擔心模板上的換行符。我還沒有測試過,但將escape_js轉換成一行? – Rodrigo 2009-10-05 13:13:15

+0

只是添加到我的評論。 JS沒有HEREDOC構造。我想要做的某種 HEREDOC 渲染部分 HEREDOC 我發現是人們說使用HTML的。 – Rodrigo 2009-10-05 13:14:57

+0

我編輯了我的帖子,闡明瞭escape_javascript的工作原理。 – 2009-10-05 13:32:25