Ann*_*nna 5 javascript instance-variables ruby-on-rails-4
我在rails控制器中有一个变量
def index
@approveflag = true
end
Run Code Online (Sandbox Code Playgroud)
我需要在我的javascript代码中访问此变量,我在index.html.erb中使用了下面给出的代码
<script>
alert("<%=@approveflag%>")
<script>
Run Code Online (Sandbox Code Playgroud)
结果为"true"时效果很好.但是当我将此代码移动到相应的.js文件时,它会发出一个结果字符串""<%= @ approveflag%>""的警告.是什么原因.我怎么解决这个问题?
提前致谢.
我个人不喜欢将js与erb混合,所以我会做这样的事情:
在index.html.erb中
<%= content_tag :div, '', id: 'mycontainer', data: { source: @approveflag } %>
Run Code Online (Sandbox Code Playgroud)
在js
$('#mycontainer').data('source')
alert($('#mycontainer').data('source'))
Run Code Online (Sandbox Code Playgroud)
并且您拥有该实例变量的值,您可以根据需要在link_to中添加数据属性.
您无法使用这些js文件,它们是资产管道的一部分,它们是经过编译/压缩的,最好只能由客户端(浏览器)下载一次.所以他们不应该改变.因此,在预编译js文件时,实例变量未设置,无论如何都没有任何意义.
但是有一些选择.
您可以在视图中声明一个javascript变量,javascript可以使用该变量(对于全局数据)
代码(我使用haml):
:javascript
var approveFlag = #{@approveflag} ;
Run Code Online (Sandbox Code Playgroud)
如果数据属于特定元素,则可以在元素上声明数据标记.但是,例如,你也可以data在body元素上添加-tag
例如
%body{:'data-approveflag' => @approveflag}
Run Code Online (Sandbox Code Playgroud)
或类似的东西
= link_to 'Collapse', '#', 'data-collapse-div' => 'class-to-collapse'
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用ajax/json下载数据.这很干净,但增加了额外的延迟,所以只有这样才能立即获得数据.
我建议您使用“ gon”宝石
我通常更倾向于不意味着要安装的直接选项,但是请相信我使用“ gon”是非常直接和干净的
在您的Gemfile中添加以下行
# To use controller variables as javascript variables
gem 'gon'
Run Code Online (Sandbox Code Playgroud)
进行捆绑安装以获取/安装gem
在您的app / views / layouts / application.html.erb中添加以下行
<%= include_gon %>
Run Code Online (Sandbox Code Playgroud)
然后在您的控制器中将变量传递给gon,就像这样简单
gon.your_variable = @controller_variable
Run Code Online (Sandbox Code Playgroud)
并在您的javascript中检索变量(在这种情况下为显示警报)
alert (gon.your_variable) ;
Run Code Online (Sandbox Code Playgroud)
就是这样!
有关更多示例和详细信息,请参见Wiki页面-https://github.com/gazay/gon/wiki
| 归档时间: |
|
| 查看次数: |
7819 次 |
| 最近记录: |