【问题标题】:Coffeescript if ignoring line of codeCoffeescript 如果忽略代码行
【发布时间】:2023-03-04 19:45:02
【问题描述】:

我对javascript 或coffeescript 不是特别有经验,但我设法使用coffeescript 和jQuery 创建了一个简单的函数。该功能用于为锦标赛组织网站突出显示和显示/隐藏游戏,以便自动隐藏和取消选中不应选择的游戏,并且一次只显示一个未决定的游戏。除了一个警告之外,该功能完美地工作:

validate = ->
finished = true
$('.edit').find('.round').find('.match').each (m, match) ->
    wins = {}
    valid = true
    $(match).find('.game').each (g, game) ->
        if valid
            $(game).show()
            $(game).find('label').css('background-color', 'red')

            checked = $(game).find(':checked')

            if checked.length == 0
                valid = false

            else
                winner = checked.attr('value')
                if winner of wins
                    if ++wins[winner] == 2
                        valid = false
                else
                    wins[winner] = 1
                $('label[for=' + checked.attr('id') + ']').css('background-color', 'green')


        else
            $(game).find(':checked').prop('checked', false)
            $(game).hide()

    if finished
        done = false
        for p, w of wins
            if w == 2
                done = true
        if not done
            finished = false

    if finished
        $('input:submit').show()
    else
        $('input:submit').hide()

除非我在

之后写一些东西,anything,否则该函数将拒绝工作
if checked.length == 0
    valid = false

在与valid = false相同的缩进上

我的意思是什么。我可以在那里设置一个新变量,它工作正常!

我四处寻找这是否是一些缩进错误,它只是忽略了该行。我试过了

valid = false if checked.length == 0

但我只是从 rails 得到一个错误,因为在那之后我有一个 else 语句。请有人向我解释发生了什么。

【问题讨论】:

  • “拒绝工作”究竟是什么意思?如果你使用valid = false if checked.length == 0,你得到的确切错误信息是什么?
  • 两件事。 1.“拒绝工作”是什么意思?您是否在控制台中收到错误消息?会发生什么而不是您的预期? 2. 你确定你没有混合制表符和空格吗?你必须注意这一点。大多数咖啡脚本都是用 2 个空格缩进编写的,所以我建议用两个空格替换所有制表符。
  • @muistooshort if 你不能把 else 挂在 post-line 上。
  • @AlexWayne:这有点无关紧要,任何代码墙都应该包含确切的错误消息(包括行号)。

标签: javascript jquery ruby-on-rails coffeescript


【解决方案1】:

没有理由让 if 语句只使用 else 部分。

您应该使用unless。所以不要这样:

if checked.length == 0
  valid = false
else
  winner = checked.attr('value')
  ..

你可以这样做:

unless checked.length == 0
  winner = checked.attr('value')
  ..

或者只是:

if checked.length
  winner = checked.attr('value')
  ..

【讨论】:

    【解决方案2】:

    我向大家道歉,因为我没有更详细地解释我的代码。

    我的问题是,如果我没有在 value = false 语句之后添加另一行,我的函数将不会隐藏或重新着色其余游戏。很抱歉我没有提到这一点。

    有问题的 if 子句是验证是否有任何选定的单选按钮,这是我收集信息的方式,我也没有指定,很抱歉。如果没有选中单选按钮,则该函数将设置 valid 为 false,以便所有未来的游戏也将被隐藏和取消选中。如果有选中的项目,则该函数会计算谁赢了并相应地重新着色,如果有人赢了两次,则比赛中所有未来的比赛都无效。

    在使用 js2coffee.org 仔细查看我转换的 javascript 后,我​​发现咖啡脚本在某些行插入隐式返回,包括 value = false,因为预处理器确定这是最后一行代码运行应该是由逻辑达到,根据这位先生here,如果您在每个块中返回 false,它将打破循环。

    为了解决这个问题,我需要在每个块的末尾添加一个明确的 return 来表示我希望什么都不返回:

    $('.edit').find('.round').find('.match').each (m, match) ->
        wins = {}
        valid = true
        $(match).find('.game').each (g, game) ->
            if valid
                $(game).show()
                $(game).find('label').css('background-color', 'red')
    
                checked = $(game).find(':checked')
    
                if checked.length is 0
                    valid = false
                else
                    winner = checked.attr('value')
                    if winner of wins
                        valid = false if ++wins[winner] is 2
                    else
                        wins[winner] = 1
                    $('label[for=' + checked.attr('id') + ']').css('background-color', 'green')
            else
                $(game).find(':checked').prop('checked', false)
                $(game).hide()
            return
        return
    

    为了简洁起见,我还将 == 更改为 is 和一些 if 子句。

    【讨论】:

      猜你喜欢
      • 2014-10-21
      • 1970-01-01
      • 2015-08-19
      • 2023-03-17
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      相关资源
      最近更新 更多