Rails CoffeeScript在加载时执行命令

时间:2013-03-09 13:20:53

标签: jquery coffeescript

我有一个CoffeeScript文件作为Rails应用程序的一部分,如下所示

    jQuery ->
      $ ->
        $('#secondthing').hide()

      $('#trips').change ->
        trips = $('#trip_quantity :selected').text()
        if trips == '1'
          $('#secondthing').hide()
        else
          $('#secondthing').show()

现在,在行程更改时执行的代码部分工作正常。但是,一旦页面加载后执行的第一部分代码就不会改变。我不知道从哪里开始

2 个答案:

答案 0 :(得分:1)

尝试删除第二行的$ ->

jQuery ->
  // $ ->
  $('#secondthing').hide()

  $('#trips').change ->
    trips = $('#trip_quantity :selected').text()
    if trips == '1'
      $('#secondthing').hide()
    else
      $('#secondthing').show()

答案 1 :(得分:1)

您的代码没有问题,因此如果它不起作用,原因必须是您未显示的部分。但是我指出了一些显然让人混淆的事情。

首先,不需要在同一范围内同时使用jQuery$$只是jQuery的别名,并且两个名称都有意义的唯一情况是出于兼容性原因(与其他版本的jQuery或其他库也使用$作为快捷方式)您将代码封装在如下模块中:

(function($) {
  // Now $ is bound to whatever object you pass in
})(jQuery);

鉴于我们可以在您的代码中自由地将$替换为jQuery,下一条误解就是(在一行上压缩):

$ -> $ -> $("#foo").hide()

此代码段安排在加载DOM后执行回调。这个回调反过来安排另一个回调,以便在加载DOM后隐藏#foo。由于第二个计划是在已经加载DOM的情况下运行的,因此实际上它会立即执行。这就是为什么,即使你应该真的使用

$ -> $("#foo").hide()

原始代码中的任何额外“级别”都无害,实际上一切正常as expected。顺便说一下,这是您代码中最紧凑的版本:

$ ->
  el = $("#secondthing")

  el.hide()

  $("#trips").change ->
    el[if $('#trip_quantity :selected').text() == '1' then "hide" else "show"]();