如何在 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 引擎中的实例变量的主要内容,如果未能解决你的问题,请参考以下文章

在 slim 中,如何在脚本顶部嵌入样式?

在Slim 4中访问中间件中的路由参数。

在 Slim 模板中将数据从 Phoenix 发送到 Javascript

text Slim模板引擎的基本使用

使用 php Slim 框架实现访问控制认证

PHP Slim 框架初体验之无法访问控制器