2009-10-01 60 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