2011-11-11 139 views
15

我一直在嘗試更新總價格,當有人改變選擇選項。下面是我使用的select元素:爲什麼我的CoffeeScript if/else語句不起作用?

<select id="payment_talks_purchased" name="payment[talks_purchased]"> 
    <option value="1">One</option> 
    <option value="2">Three</option> 
</select> 

這是jQuery的我使用的是:

jQuery(document).ready(function() { 
    var price = $(".total-price span.price") 
    var save = $(".savings") 
    $("#payment_talks_purchased").change(function() { 
    var selection = $("#payment_talks_purchased").val() 
    if (selection == 2) { 
     price.html("$12"); 
     save.css("visibility", "visible"); 
    } else if (selection == 1) { 
     price.html("$5"); 
     save.css("visibility", "hidden"); 
    } 
    }); 
}); 

它完美。它將價格更改爲12美元,並顯示折扣消息。如果我將選擇選項更改回One/1,則會將文本更改回$ 5並刪除折扣消息。

我將其轉換爲CoffeeScript,但它只適用於我進行第一次更改。價格已更新。但是,當我嘗試將其更改回選項1時,它不會更新。

jQuery -> 
    price = $(".total-price span.price") 
    save = $(".savings") 
    select = $("#payment_talks_purchased") 
    select.change -> 
    selection = select.val() 
    if selection = 2 
     price.html "$12" 
     return save.css "visibility", "visible" 
    else if selection = 1 
     price.html "$5" 
     return save.css "visibility", "hidden" 

我一直在這工作了幾個小時,並在我的智慧結束。任何幫助將不勝感激。

回答

26

您的selection = 1您的if聲明在CoffeeScript中仍然是一項任務,您需要使用==進行比較。試試這個:

jQuery -> 
    price = $(".total-price span.price") 
    save = $(".savings") 
    select = $("#payment_talks_purchased") 
    select.change -> 
    selection = select.val() 
    if selection == '2' 
     price.html "$12" 
     return save.css "visibility", "visible" 
    else if selection == '1' 
     price.html "$5" 
     return save.css "visibility", "hidden" 

此外,== is converted to ===所以你要進行比較的字符串,除非你想你的價值「中投」使用selection = +select.val()(感謝Trevor Burnham此鑄造招)或parseInt(select.val(), 10)一個數字。

+4

沒錯。如果您想將表單輸入轉換爲數字,請使用'selection = + select.val()'。 –

+0

非常感謝您的幫助。那就是訣竅。 –

+0

除非你明確地想要觸發類型強制,否則不是比較首選嗎? – jpmc26

6

您可以使用開關:

switch selection 
    when '2' 
    price.html "$12" 
    save.css "visibility", "visible" 
    when '1' 
    price.html "$5" 
    save.css "visibility", "hidden" 

你也可以拿走return,因爲函數總是返回他們的最終值。

1

這是我的.50美分。考慮兩件事:它只是我的簡單意見,它可能不是世界上最好的答案。

a)如果你已經有IF語句中返回,不需要ELSE IF

jQuery -> 
price = $(".total-price span.price") 
save = $(".savings") 
select = $("#payment_talks_purchased") 
select.change -> 
    selection = select.val() 
    if selection == '2' 
     price.html "$12" 
     // Since you return here, you dont need any other "else if" 
     return save.css "visibility", "visible" 

    price.html "$5" 
    return save.css "visibility", "hidden" 

不,恕我直言,放ELSE IF犯規提高可讀性。回報是回報。期。這很簡單。

jQuery -> 
price = $(".total-price span.price") 
save = $(".savings") 
select = $("#payment_talks_purchased") 
select.change -> 
    selection = select.val() 
    // "ternary" coffee version (if then else) 
    price.html if selection == '2' then "$12" else "$5") 
    save.css "visibility" (if selection == '2' then "visible" else "hidden") 

但是,比所有更好的是擺脫IF,ELSE,SWITCH和所有這些胡扯。認爲OOP和你的代碼可以開始變得更好。起點可能是:

options = [ 
      {price: '$12', visible:"visible"}, 
      {price: '$5', visible:"hidden"} 
      ]; 
jQuery -> 
    price = $(".total-price span.price") 
    save = $(".savings") 
    select = $("#payment_talks_purchased") 
    select.change -> 
       // If the val of your select was 0 and 1, you wouldnt need the (-1) part 
     selection = parseInt(select.val) -1 
       price.html options[selection].price 
       save.css "visibility" options[selection].visible 

所以,就是這樣。幾乎相同的代碼,但具有更好的實現(imho)。謝謝。

相關問題