我已经进入资产文件夹,每个模型都有不同的coffeescript文件。但是每次访问页面时都会执行它们,即使它来自不同的控制器。如果我继续/插入/新我希望只执行insertion.coffee,而不是所有的.coffee启动。我怎样才能一次推出一个?
这是我的insertions.coffee
$(document).on "turbolinks:load", ->
if ($('#insertion_book_search'))
console.log("found")
console.log($('#insertion_book_search').length)
console.log($('#insertion_book_title').length)
$('#insertion_books_subject').parent().hide()
那是我的static_pages.coffee
$(document).on "turbolinks:load", ->
console.log("Mie cose")
$('.last_img').on 'load', ->
natHeight = $(this).get(0).naturalHeight
natWidth = $(this).get(0).naturalWidth
if (natWidth > natHeight)
$(this).css( 'width','100%')
else
$(this).css( 'height','100%')
我想要实现的是,当我使用插入控制器时,它只加载inserted.coffee,当我使用静态页面控制器时,它只加载static_pages 。咖啡。
根据我的理解,当我将// require_tree .
行添加到/app/assets/javascript/application.js
时,我的所有咖啡都被加载到我的所有视图中。
如果我删除了需求树,我尝试使用<%= javascript_include_tag ..%>添加它们。我需要一个.js文件而不是咖啡。可以加载咖啡文件吗?
答案 0 :(得分:3)
您可以使用coffeescript OOP方法进行选择,下面是您需求的详细信息和一些代码
示例coffeescript并检查每页加载
class App.PurchaseRequest
renderYourJavascript: ->
console.log "purchase request js"
$(document).on "turbolinks:load", ->
if $(".purchase_requests.new")[0] || $(".purchase_requests.edit")[0]
purchase_request = new App.PurchaseRequest
purchase_request.renderYourJavascript()
从上面的代码中可以看出,你可以通过检查$(“。controllers.action”)来分割[0]
答案 1 :(得分:1)
您应该阅读有关Rails asset pipeline的更多信息。您的所有脚本都已执行,因为您的//= require_tree .
清单文件中很可能有application.js
directive。
如果要为操作手动指定JS文件,则应重新组织清单(至少从中删除//= require_tree .
),然后可以使用javascript_include_tag
手动包含JS。更多信息here。
注意:如果手动包含文件,而不在清单中提及它们,则还应将Rails.application.config.assets.precompile += %w( path/to/file )
添加到config/initializers/assets.rb
以进行预编译。否则,您将获得一个异常,告诉您这样做。更多内容here。
如果我删除了需求树,我尝试使用<%= javascript_include_tag ..%>添加它们。我需要一个.js文件而不是咖啡。可以加载咖啡文件吗?
无论如何,您的coffeescript文件正在预编译到JS。您只需指定不带扩展名的文件名。
答案 2 :(得分:0)
您可以在类中封装Coffeescript逻辑,然后在您实际需要调用逻辑的视图中初始化类。
所以你的咖啡文件看起来像这样:
class YourClass
constructor: () ->
# Anything here will be called when this object is instantiated
@firstMethod()
@secondMethod()
firstMethod: () ->
$('#some-element').click () ->
alert('hello world')
secondMethod: () ->
console.log('second method triggered!')
window.YourClass = YourClass
然后,只要您在特定视图中需要此逻辑,您实际上只需初始化此对象:
<script>
var yourClass = new YourClass();
</script>
您甚至可以通过将它们移出构造函数方法并在视图中显式调用它们来调用特定方法:
<script>
var yourClass = new YourClass();
yourClass.methodNotInConstructor();
</script>