1

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

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

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

现在,当行程发生变化时执行的代码部分可以正常工作。但是,页面加载后要执行的第一段代码不会改变。我不知道从这里去哪里

4

2 回答 2

1

尝试删除$ ->第二行的。

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

  $('#trips').change ->
    trips = $('#trip_quantity :selected').text()
    if trips == '1'
      $('#secondthing').hide()
    else
      $('#secondthing').show()
于 2013-03-09T14:30:51.620 回答
1

你的代码没有问题,所以如果它不起作用,原因一定是你没有显示的部分。但是,我要指出一些显然使人们感到困惑的事情。

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

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

鉴于我们可以在您的代码中自由替换$jQuery下一个误解是(压缩在一行中):

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

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

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

原始代码中的任何额外“级别”都没有害处,实际上一切都按预期工作。顺便说一句,这是您的代码最紧凑的版本:

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

  el.hide()

  $("#trips").change ->
    el[if $('#trip_quantity :selected').text() == '1' then "hide" else "show"]();
于 2013-03-09T16:09:02.980 回答