これはどのように行われているのかわかりません。私は使用しようとしているルートをハードコーディングできますが、これを正しい方法で実行したいと思います。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)
あなたはこのことについて間違った方法を考えています。 JavaScriptはクライアント側で実行され、スカラはサーバー側で実行されます。その方向(JavaScriptからScala)で2つの間で通信する唯一の方法はPOSTまたはGETです。 –
はい、そうですが、ページがレンダリングされる前にScalaステートメントを処理する必要があります。私は間違いなくそのルートの価値を得るのにRESTコールをしたいとは思わない。私はJSでルートをコールしたり、ハードコーディングしたりせずに、これを動的に行う方法があることを望みます。 – Samo
ルーティングの一部にすることはできますか? 'location.href = '/ products /' + $(this).val();'と同様に、ルートconfig/controllerでそれを処理します。あなたのケースの詳細については、実際には "$(this).val()"はもっと良い解決策を見つけるのに役立ちますか? –