Ich bin mir nicht sicher, wie das gemacht wird. Ich könnte die Route, die ich benutzen möchte, fest programmieren, aber ich würde das gerne richtig machen.Mischen von JavaScript und Scala in einer Play-Vorlage
Ich habe ein Dropdown, das eine neue Seite bei Änderung laden muss. Hier ist im Grunde, wie ich versuche, es zu tun (ich habe ein paar Variationen dieses versucht):
@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>
Dies erzeugt eine identifier expected but 'val' found
Ausnahme. Ich versuchte auch, es in Anführungszeichen zu umgeben, aber das verursacht eine [NumberFormatException: For input string: "$(this).val()"]
Also wie zum Teufel mache ich einen Wert aus JavaScript in eine Scala-Funktion?
bearbeiten
Hier ist meine Lösung, durch die akzeptierte Antwort inspiriert. Dieses Dropdown wird in einem Tag definiert, das von verschiedenen Komponenten wiederverwendet wird. Die Basis-URL ist für jede Komponente unterschiedlich. Die Art und Weise, dies zu erreichen war, eine Funktion zu übergeben, die eine URL auf einem Konto Schlüssel in das Drop-Down-Basis erzeugt:
@(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>
Dann Sie eine Funktion wie folgt definieren kann passieren:
@transactionsUrl(memberAccountKey: Long) = {
@routes.Accounts.transactions(memberAccountKey)
}
@accountsDropdown(transactionDetails.getMemberAccounts(), transactionDetails.getMemberAccountKey(), transactionsUrl)
Sie darüber in die falsche Richtung zu denken. JavaScript wird auf der Clientseite ausgeführt, während scala auf der Serverseite ausgeführt wird! Die einzige Möglichkeit, zwischen den beiden in dieser Richtung (JavaScript zu Scala) zu kommunizieren, ist mit einem POST oder GET. –
Ja, Sie haben Recht, diese Scala-Anweisungen müssen verarbeitet werden, bevor die Seite gerendert wird. Ich möchte definitiv keinen REST-Aufruf machen, nur um den Wert dieser Route zu erhalten. Ich wünschte, es gäbe eine Möglichkeit, dies dynamisch zu tun, ohne die Route in JS aufzurufen oder hart zu codieren. – Samo
Können Sie es Teil des Routing machen? Wie 'location.href = '/ products /' + $ (this) .val();' Behandle es dann in der Route config/controller. Vielleicht würde uns mehr über Ihre Fallspezifika helfen, eine bessere Lösung zu finden, was ist "$ (this) .val()" in der Praxis? –