gpt4 book ai didi

javascript - 与 Rails 和 Javascript 共享模板

转载 作者:行者123 更新时间:2023-11-28 02:59:28 25 4
gpt4 key购买 nike

所以我有一个解决方案,但我想获得一些意见,看看是否有更好的方法来做到这一点。

我的问题基本上是我列出了将由 RoR 加载时生成的数据列表,然后使用 JS 控件来查看子集。我宁愿不必支持基本相同的 HMTL 的两个版本。所以我的解决方案是这样的,我有一个 ruby 部分,看起来像这样:

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

因此,当我使用 ruby​​ 渲染部分时,我传入 false 的 jsmode,它会像普通部分一样渲染。然后,我将再次渲染用带有模板 ID 的 div 包裹的部分,但这次 jsmode 为 true。这将使用 #{} 字符串呈现 html。然后我可以将模板传递给原型(prototype) Template 对象,如下所示:

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

所以我的问题是,有更好的方法吗?

我知道如果我用双引号将变量括起来,我可以使用 #{} 构造将变量传递给 RoR,但我需要 #{} 来呈现 JS 模板。

想法?

最佳答案

总体方法看起来不错,实际上在某些情况下可能比我之前所做的要好一些。

但是,在我看来,您实际上是将 JS 版本渲染到 div,然后将其传递到原型(prototype)模板中。模板还接受一个字符串,因此您可以直接将原始 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 使用以下 map :

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>";

这应该可以很好地解决问题。

关于javascript - 与 Rails 和 Javascript 共享模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1504324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com