在所有视图中调用CoffeeScript函数(Ruby on Rails)

时间:2016-05-26 22:44:16

标签: javascript jquery ruby-on-rails ruby coffeescript

这是我的第一个StackOverflow问题,所以我希望我问对了!

我有一个Ruby on Rails Web应用程序,在我们的javascript文件中,我有以下CoffeeScript代码,它可以检测id ="提交"按下,然后滚动到出现的第一个错误,如果有的话(在我们的表单中使用"提交"按钮):



@scroll_to_error = ->
  document.getElementById('submit').onclick = ->
  	if $('.alert-danger:visible:first').length > 0
      $('html, body').animate { scrollTop: $('.alert-danger:visible:first').offset().top - 220 }, '1000'
  	return




我在config文件夹中的application.rb文件中包含了这个文件,所以可以在views部分的任何HTML文件中调用它~~但是,我想知道是否有办法使它可以在我拥有的所有观点中都有所称呼。有没有办法做到这一点?

希望这是足够的信息 - 抱歉,我无法提供更多的代码片段,因为我正在为一家公司编写代码(因此"我们的")。

2 个答案:

答案 0 :(得分:1)

尝试这样的事情?

dest.Range("E" & destRow) = Int(src.Range("F" & i).VALUE2)
dest.Range("E" & destRow).numberformat = "mm/dd/yyyy"

以及设置了scrollToError = -> $('*[data-scroll-to-error="true"]').click -> alertElement = $('.alert-danger:visible:first') if alertElement.length > 0 $('html, body').animate { scrollTop: alertElement.offset().top - 220 }, '1000' # Run with turbolinks. $(document).on 'page:change', scrollToError 属性的提交按钮。

data-scroll-to-error

我发现你的陈述令人困惑:

  

我将该文件包含在配置中的application.rb文件中   文件夹,以便可以在视图部分的任何HTML文件中调用

假设这是一个标准的Rails项目,你应该在<input type="submit" data-scroll-to-error="true" /> (清单文件)中包含包含Coffeescript代码的文件,因为assets/javascripts/application.js是布局中所需的JS文件(isn& #39;是吗?: - /),此代码将在您的所有视图上执行。我不知道application.js如何参与其中。

更新:添加更多信息。

如果您不确定如何使用config/application.rb文件(清单文件),请花时间浏览Rails&#39;关于它的官方文件(特别是关于清单的部分)。

http://guides.rubyonrails.org/asset_pipeline.html#manifest-files-and-directives

在您的情况下,您需要修改application.js以包含:

application.js

基本上,您列出了要加载的所有资产文件以及使用布局的所有页面(可能是... //= require error ... ),然后仅提及布局的清单文件。这样,Rails可以连接和缩小以生成单个资产文件。默认的application.html.erb清单文件会自动进行预编译 - 因此您无需手动将新资产添加到预编译列表中。

我将选择器编写为application.的原因是个人偏好 - 代码对我来说更好。如果你确定ID *[data-scroll-to-error="true"]是(并且将来)仅应用于需要滚动到错误的元素,那么将第一个选择器更改为{{1} }

答案 1 :(得分:0)

执行此操作的一种方法是在函数中公开代码,以便可以从视图中调用它。

Coffeescript档案:

window.SomeNamespace ||= {}
window.SomeNamespace.scroll_to_error = ->
  document.getElementById('submit').onclick = ->
    if $('.alert-danger:visible:first').length > 0
      $('html, body').animate { scrollTop: $('.alert-danger:visible:first').offset().top - 220 }, '1000'

查看文件(假设您使用的是erb)

<script>
  $(function(){ 
    window.SomeNamespace.scroll_to_error()
  });
</script>

然而,更好的方法是分离视图代码和javascript代码。 elementaljs为Rails提供了一个小的Javascript行为库,我非常喜欢它。你可以&#34;附加&#34;通过data属性对特定html元素的javascript行为,并且库为您完成上述工作。