2014-04-13 8 views
45

Ich habe ein paar verschiedene Tasten, die die gleiche Funktion aufrufen und ich möchte sie in eine switch-Anweisung verpackt haben, anstatt eine Reihe von anderen wenn Bedingungen verwenden. Jede Hilfe wäre großartig !!!Switch Case-Anweisung in Kaffee-Skript

events: 
"click .red, .blue, #black, #yellow" : "openOverlay" 

openOverlay: (e) -> 
    e.preventDefault() 
    e.stopPropagation() 

target = $(e.currentTarget) 

# the view should be opened 
view = 
    if target.hasClass 'red' then new App.RedView 
    else if target.hasClass 'blue' then new App.BlueView 
    else if target.is '#black' then new App.BlackView 
    else 
    null 

# Open the view 
App.router.overlays.add view: view if view? 
+0

Es ist nicht geeignet für eine switch-Anweisung (hasClass vs is). – user2864740

Antwort

97

Es gibt zwei Formen von switch in Coffeescript:

switch expr 
    when expr1 then ... 
    when expr2 then ... 
    ... 
    else ... 

und:

switch 
    when expr1 then ... 
    when expr2 then ... 
    ... 
    else ... 

Die zweite Form dir helfen könnten:

view = switch 
    when target.hasClass 'red' then new App.RedView 
    when target.hasClass 'blue' then new App.BlueView 
    when target.is '#black' then new App.BlackView 
    else null 

Sie könnten auslassen die else null Wenn undefined ein akzeptabler Wert für view ist. Sie könnten auch die Logik in eine (explizite) Funktion wickeln:

viewFor = (target) -> 
    # There are lots of ways to do this... 
    return new App.RedView if(target.hasClass 'red') 
    return new App.BlueView if(target.hasClass 'blue') 
    return new App.BlackView if(target.is '#black') 
    null 

view = viewFor target 

Geben Sie Ihre Logik einen Namen (das heißt Einwickeln es in einer Funktion) ist oft nützlich für Ihren Code zu klären.

+8

Beachten Sie, dass das 'then' muss ** nur ** in einer einzeiligen Zuweisung verwendet werden. Fügen Sie kein 'then' ein, wenn Sie Ihren Code unten schreiben oder er wird während der Kompilierung ausfallen. – Vadorequest

12

Zusätzlich zu den Angaben in the accepted answer, switch Aussagen in Coffeescript unterstützt auch , mehrere Spielergebnisse zu liefern:

switch someVar 
    when val3, val4 then ... 
    else ... 

oder (wenn Ihre Aussagen mehrere Zeilen hat):

switch someVar 
    when val3, val4 
     ... 
    else 
     ... 
+0

Ich glaube nicht, dass "or" hier ist - es wird 'case (val1 || val2):' statement - ie. Ausführen einer booleschen Operation für "val1" und "val2" - was ich hier nicht erwartet hätte. Das '' 'macht aber den Trick. – Voy

+0

@Voy: Sie haben Recht - 'oder' produziert nicht das gewünschte Ergebnis. Antwort aktualisiert – larsmoa