2014-09-24 33 views
-1

我對javascript或coffeescript沒有特別的經驗,但我設法使用coffeescript和jQuery創建了一個簡單的函數。該功能用於突出顯示/顯示/隱藏組織賽事比賽的組織網站,以便它自動隱藏和取消選中不應選擇的比賽,並且一次只顯示一個未決定的比賽。該功能的工作原理完全符合所有,但一個警告:Coffeescript如果忽略代碼行

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() 

功能將拒絕工作,除非我寫的東西,什麼,後

if checked.length == 0 
    valid = false 

在同一縮進作爲有效=虛假

我的意思是任何事情。我可以在那裏設置一個新的變量,它工作正常!

我已經搜尋過,試圖找出這是否是一些縮進錯誤,它只是忽略了這一行。我試過

valid = false if checked.length == 0 

但我只是得到軌錯誤,因爲我之後,如果有一個else語句。請有人向我解釋發生了什麼事。

+0

「拒絕工作」究竟意味着什麼?如果你使用'valid = false,如果checked.length == 0',你得到的確切錯誤信息是什麼? – 2014-09-24 17:36:40

+0

兩件事。 1.「拒絕工作」是什麼意思?你的控制檯中有錯誤信息嗎?會發生什麼,而不是你所期望的? 2.你確定你沒有混合標籤和空格嗎?你必須注意這一點。大多數咖啡腳本是用2個空格縮進書寫的,所以我建議用兩個空格替換所有的標籤。 – 2014-09-24 17:36:50

+1

@ muistooshort如果你不能掛一個後線。 – 2014-09-24 17:40:09

回答

0

我向大家道歉不更詳細地解釋我的代碼。

我的問題是,如果我沒有在value = false語句後添加另一行,我的函數將不會隱藏或重新着色其餘的遊戲。我很抱歉,我沒有提到這一點。

有問題的if條款正在驗證是否有任何選定的單選按鈕,這是我收集信息的方式,我也沒有詳細說明並且很抱歉。如果沒有選中單選按鈕,則該函數將設置爲false,以便所有未來的遊戲都將隱藏並取消選中。如果有檢查項目,則該功能計算誰贏了並相應地重新着色,如果有人贏了兩次,那麼在比賽中所有未來的比賽都將失效。

在仔細觀察我使用js2coffee.org轉換後的JavaScript之後,我發現咖啡腳本在某些行插入隱式返回,包括value = false,因爲預處理器確定這是代碼運行的最後一行由邏輯達成,並根據這位先生here如果你在每個塊返回false它將打破循環。

爲了解決這個問題,我需要添加在每個塊的最後一個明確的回報,以表示我想回到什麼:

$('.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 

我也改變==來是,如果一些爲簡明起見,條款是一條線。

0

沒有理由讓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') 
    ..