Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何防止加载不正确的.js.coffee文件_Jquery_Ruby On Rails_Coffeescript_Asset Pipeline - Fatal编程技术网

Jquery 如何防止加载不正确的.js.coffee文件

Jquery 如何防止加载不正确的.js.coffee文件,jquery,ruby-on-rails,coffeescript,asset-pipeline,Jquery,Ruby On Rails,Coffeescript,Asset Pipeline,在我的rails应用程序中,似乎所有的.js.coffee文件都被加载到了每个页面,不管发生什么。我遇到的问题是,locations.js.coffee文件正在加载,然后在函数中返回空值,因为locations.js.coffee文件正在查找的表不存在于除locations页面之外的任何其他页面上 注意:在每个文件:users.js.coffee、locations.js.coffee和magnities.js.coffee中,我分别放置了console.log(“users.coffee-lo

在我的rails应用程序中,似乎所有的.js.coffee文件都被加载到了每个页面,不管发生什么。我遇到的问题是,locations.js.coffee文件正在加载,然后在函数中返回空值,因为locations.js.coffee文件正在查找的表不存在于除locations页面之外的任何其他页面上

注意:在每个文件:users.js.coffee、locations.js.coffee和magnities.js.coffee中,我分别放置了console.log(“users.coffee-loaded”)、console.log(“locations.coffee-loaded”)和console.log(“magnities.coffee-loaded”)行,以查看它们是否已加载

例如,刷新locations页面将成功输出到控制台:

但是冒险进入用户或活动页面将尝试加载文件locations.js.coffee,但是由于locatrions.js.coffee所依赖的id为
#restaurantLocations
的表在用户或活动中不存在,因此产生的错误是:

对于文件locations.js.coffee中的行:
table.columns().eq(0).each(colIdx)

如何防止此错误,或仅允许为正确的页面加载正确的文件,并防止其他页面加载?

(剩余locations.js.coffee代码):

jQuery->
console.log(“locations.coffee加载”)
#设置-向每个页脚单元格添加文本输入
$(“#餐厅位置tfoot th”)。每个->
title=$(“#restaurantLocations thead”).eq($(this.index()).text()
$(此).html“”
#数据表
table=$(“#restaurantLocations”).DataTable()
#应用搜索
table.columns().eq(0).each(colIdx)->
$(“输入”,table.column(colIdx.footer())。在“键控更改”上,->
table.column(colIdx).search(@value).draw()
#隐藏id列,但用于数据操作
表.列(0).可见(假)
#允许多选
$(“#restaurantLocations tbody”)。在“单击”、“tr”上->
$(此).toggleClass“已选定”
#允许删除(工作)
$(“#删除位置”)。单击->
multiSelected=表.rows(“.selected”).data()
table.rows(“.selected”).remove().draw false
对于在multiSelected中选择的位置
id=locationSelected[0]
$.ajax({
url:“/locations/”+id,#注意:$.ajax安装程序与设置/locations/(id编号)一样工作,允许删除
类型:“post”,
数据类型:“json”,
数据:{u方法“:“删除”}
})
#有条件的“全选”(工作)
$(“#选择所有位置”)。单击->
表.$('tr',{“filter”:“applied”}).addClass“selected”
#取消选择所有(工程)
$(“#取消所有位置”)。单击->
表.$(“tr”).removeClass“已选定”

默认情况下,Rails在
app/assets/javascripts/application.js中包含一个文件,该文件需要
app/assets/javascripts
中的所有其他文件。然后,默认应用程序布局包括该文件

还有其他方法来组织您的资产,包括。这些需要自定义您的资产配置

但是,我不建议这样做。如果您能够以这样一种方式编写JavaScript,即它可以包含在每个页面上,并且在不需要它的页面上不执行任何操作,那就更好了

有很多方法可以实现这一点:一个简单的方法是使用jQuery在页面主体上或页面上的其他地方查找特定的类

在上面的代码中,您需要做的就是将
if$(“#restaurantLocations”).length>0
包装在整个事件中(但在
jQuery
回调函数中)

这给您带来了一些好处:

  • 它是一种更简单的配置,遵循Rails默认约定,并且更容易理解
  • 它对应用程序中的更改更具弹性。如果您需要在新页面上使用该JavaScript,或者在现有页面上不再需要它,则只需添加或删除相关类(或您正在搜索的任何标记),而不必对脚本标记或资产清单中的require语句大惊小怪
  • 它避免了重复。如果不同页面上的脚本共享公共依赖项,则需要在两个顶级脚本中都使用它们
  • 这对用户来说更好,因为在预编译资产之后,您将在应用程序的每个页面上使用一个连接和压缩的文件。用户只需下载一次,然后在导航到其他页面时,它将从缓存中加载。除非有大量JavaScript局限于大多数用户从未访问过的页面,否则将所有内容组合起来会更有效

有关Rails中资产如何工作的详细信息,请阅读。

我要补充的唯一一点是,如果您使用的是一个巨大的document.ready函数,那么您可能做错了+1.
jQuery ->
  console.log("locations.coffee loaded")

  # Setup - add a text input to each footer cell
  $("#restaurantLocations tfoot th").each ->
    title = $("#restaurantLocations thead th").eq($(this).index()).text()
    $(this).html "<input type=\"text\" placeholder=\"Search " + title + "\" />"

  # DataTable
  table = $("#restaurantLocations").DataTable()

    # Apply the search
  table.columns().eq(0).each (colIdx) ->
    $("input", table.column(colIdx).footer()).on "keyup change", ->
      table.column(colIdx).search(@value).draw()

  # Hiding the id column, but for use for data manipulation
  table.column( 0 ).visible( false )

  # Allowing multi-select
  $("#restaurantLocations tbody").on "click", "tr", ->
    $(this).toggleClass "selected"

  # Allowing deletion (works)
  $("#deleteLocations").click ->
    multiSelected = table.rows(".selected").data()
    table.rows(".selected").remove().draw false
    for locationSelected in multiSelected
      id = locationSelected[0]
      $.ajax({
        url: "/locations/" + id,     # Note: $.ajax setup works as setting /locations/(id number) will allow deletion
        type: "post",
        dataType: "json",
        data: {"_method":"delete"}
      })

  # Conditional 'Select All' (works)
  $("#selectAllLocations").click ->
    table.$('tr', {"filter":"applied"}).addClass "selected"

  # Deselecting all (works)
  $("#deSelectAllLocations").click ->
    table.$("tr").removeClass "selected"