如何在 Slim 模板中访问 CoffeeScript 引擎中的实例变量
Posted
技术标签:
【中文标题】如何在 Slim 模板中访问 CoffeeScript 引擎中的实例变量【英文标题】:How to access instance variables in CoffeeScript engine inside a Slim template 【发布时间】:2011-12-27 20:30:14 【问题描述】:我有一个 Rails 控制器,我在其中设置一个实例变量 -
@user_name = "Some Username"
在我的 .slim 模板中,我使用咖啡引擎生成 javascript,并希望从客户端 sie javascript 代码中打印出用户名 -
coffee:
$(document).ready ->
name = "#@user_name"
alert name
但这是正在生成的 javascript??
$(document).ready(function()
var name;
name = "" + this.my_name;
alert(name);
如何在我的 CoffeeScript 代码中访问控制器实例变量?
我将其标记为 haml,因为我猜 haml 在使用 CoffeeScript 时会遇到同样的问题。
【问题讨论】:
@Thilo 不,他正在尝试注入 Ruby 变量@user_name
。 Ruby 和 CoffeeScript 使用相同的字符串插值语法。
我明白了。顺便说一句,变量名怎么从"#@user_name"
变成this.my_name
?
因为在coffeescript中,@prop被编译成this.prop
***.com/questions/17560864/… 类似问题/解决方案
【参考方案1】:
你也可以使用:
$(document).ready ->
name = <%= JSON.generate @user_name %>
alert name
这是因为JSON 是 JavaScript 的子集。
【讨论】:
这很难。或者至少在 Dashing .coffee 文件中是这样。【参考方案2】:我倾向于不惜一切代价避免使用内联 javascript。
在你的 javascript 中存储变量的好方法是使用 html5 数据属性。这是保持 javascript 不显眼的理想选择。
【讨论】:
如果您使用 JavaScript MVC 并希望避免向服务器发出多个 HTTP 请求,那将没有帮助。 backbonejs.org/#FAQ-bootstrap 如果您使用的是 javascript MVC,您通常会执行 ajax 请求来获取数据,并在客户端上呈现 html。但是例如,您仍然可以在 html/body/container 的数据属性中发送一次常规配置参数。 对,对。对不起,如果我太鲁莽了!【参考方案3】:发生的情况是 "#@user_name"
被解释为 CoffeeScript,而不是被评估并注入到 CoffeeScript 源中的 Ruby 代码。您在问,“如何将 Ruby 变量注入到我的 CoffeeScript 源代码中?”
简短的回答是:不要这样做。 Rails 团队有意决定在 3.1 的模板中不支持嵌入的 CoffeeScript,因为必须在每个请求上编译 CoffeeScript 都会产生巨大的性能开销(如果您允许将任意字符串注入源代码,您必须这样做) .
我的建议是将您的 Ruby 变量作为纯 JavaScript 单独提供,然后从您的 CoffeeScript 中引用这些变量,例如:
javascript:
user_name = "#@user_name";
coffee:
$(document).ready ->
name = user_name
alert name
【讨论】:
感谢您的回复,所以从性能角度来看,您的建议基本上可以吗? 这取决于 Slim 是否在每次请求时重新编译模板中的 CoffeeScript。老实说,我不确定。无论如何,您可能应该将其移至外部文件;那么它只会编译一次JS,浏览器会缓存它。以上是关于如何在 Slim 模板中访问 CoffeeScript 引擎中的实例变量的主要内容,如果未能解决你的问题,请参考以下文章