2011-11-11 84 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)。谢谢。