2012-05-22 17 views
6

これはどのように行われているのかわかりません。私は使用しようとしているルートをハードコーディングできますが、これを正しい方法で実行したいと思います。PlayテンプレートでJavaScriptとScalaを組み合わせる

変更の際に新しいページを読み込む必要があるドロップダウンがあります。ここでは基本的にどのように私はそれをやろうとしているだ(私はこれのいくつかのバリエーションを試してみた):

@getRoute(value: String) = @{ 
    routes.Accounts.transactions(Long.valueOf(value)) 
} 

    <script type="text/javascript"> 
     $(function() { 

     $("select[name='product']").change(function() { 

      location.href = @getRoute($(this).val()); 
     }).focus(); 

     $('a.view.summary').attr('href', "@routes.Accounts.index()" + "?selectedAccountKey=" + $('select[name=product]').val()); 
     }); 
    </script> 

これはidentifier expected but 'val' found例外を生成します。私も引用符で囲んでみたが、それは[NumberFormatException: For input string: "$(this).val()"]

だから私はJavaScriptの値をScala関数に挿入する方法は?

編集

ここで受け入れ答えに触発され、私のソリューションです。このドロップダウンは、さまざまなコンポーネントで再利用するために作成されたタグで定義され、ベースURLはコンポーネントごとに異なります。そして、あなたが渡すために、このような関数を定義することができます

@(accountList: List[models.MemberAccount], 
    selectedAccountKey: Long, 
    urlGenerator: (Long) => Html 
) 

<select name="product"> 
    @for(account <- accountList) { 
    @if(account.accountKey == selectedAccountKey) { 
     <option selected="selected" value="@urlGenerator(account.accountKey)">@account.description (@account.startDate)</option> 
    } else { 
     <option value="@urlGenerator(account.accountKey)">@account.description (@account.startDate)</option> 
    } 
    } 
</select> 

<script type="text/javascript"> 
$(function() { 
    $('select[name=product]').change(function() { 
     location.href = $(this).val(); 
    }); 
}); 
</script> 

:このドロップダウンにアカウントキーに基づいてURLを生成する関数を渡すことだっ達成する方法

@transactionsUrl(memberAccountKey: Long) = { 
    @routes.Accounts.transactions(memberAccountKey) 
} 

@accountsDropdown(transactionDetails.getMemberAccounts(), transactionDetails.getMemberAccountKey(), transactionsUrl) 
+1

あなたはこのことについて間違った方法を考えています。 JavaScriptはクライアント側で実行され、スカラはサーバー側で実行されます。その方向(JavaScriptからScala)で2つの間で通信する唯一の方法はPOSTまたはGETです。 –

+0

はい、そうですが、ページがレンダリングされる前にScalaステートメントを処理する必要があります。私は間違いなくそのルートの価値を得るのにRESTコールをしたいとは思わない。私はJSでルートをコールしたり、ハードコーディングしたりせずに、これを動的に行う方法があることを望みます。 – Samo

+0

ルーティングの一部にすることはできますか? 'location.href = '/ products /' + $(this).val();'と同様に、ルートconfig/controllerでそれを処理します。あなたのケースの詳細については、実際には "$(this).val()"はもっと良い解決策を見つけるのに役立ちますか? –

答えて

6

ますページにすべてのURLを格納する方法が必要です(例:

<option value="@routes.Accounts.transactions(id)">Display</option> 

その後のonChange、次のことができます。

$("select[name='product']").change(function() { 
    location.href = $(this).val(); 
}); 
+0

優れたアイデア!私はちょうど "なぜ、地獄は私がそのことを考えなかったのか"の大きな瞬間を持っていました。 – Samo

+0

私はそれがうまくいかない理由はありませんが、私はまだそれを試してみて、問題がないことを確認したいと思います。試してみると、緑のダニと15点が得られます:-) – Samo

+0

十分な公正さ - ありがとう! –

関連する問題