web-dev-qa-db-ja.com

コーヒースクリプトのSwitch Caseステートメント

同じ関数を呼び出しているいくつかの異なるボタンがあり、else if条件の束を使用するのではなく、switchステートメントでラップしたいです。どんな助けも素晴らしいでしょう!

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?
54
user992731

CoffeeScriptには switch の2つの形式があります。

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

そして:

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

2番目の形式は次の場合に役立ちます。

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

undefinedviewの許容値である場合、else nullを省略できます。 (明示的な)関数でロジックをラップすることもできます。

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

ロジックに名前を付ける(関数にラップする)ことは、コードを明確にするのに役立つことがよくあります。

111
mu is too short

受け入れられた答え の詳細に加えて、CoffeeScriptのswitchステートメントは,複数の一致結果を提供するには:

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

または(ステートメントに複数の行がある場合):

switch someVar
    when val3, val4
        ...
    else
        ...
21
larsmoa