Nie jestem pewien, jak to się robi. Mogę zakodować kod trasy, której próbuję użyć, ale chciałbym to zrobić we właściwy sposób.Łączenie JavaScript i Scala w szablonie Play
Mam menu, które musi załadować nową stronę po zmianie. Tutaj w zasadzie jak próbuję to zrobić (próbowałem kilka odmian tego):
@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>
To daje identifier expected but 'val' found
wyjątek. Próbowałem również otaczanie go w cudzysłowach, ale to powoduje, że w jaki sposób wstawić wartość z JavaScript do funkcji Scala?
Edit
Oto moje rozwiązanie, inspirowany przez przyjętą odpowiedź. To menu jest zdefiniowane w tagu, który został ponownie użyty przez różne komponenty, a podstawowy adres URL jest inny dla każdego komponentu. Drogą do osiągnięcia tego celu było przekazać funkcję, która generuje URL w oparciu o klucz rachunku na liście rozwijanej:
@(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>
Następnie można zdefiniować funkcję tak, aby przechodzić w:
@transactionsUrl(memberAccountKey: Long) = {
@routes.Accounts.transactions(memberAccountKey)
}
@accountsDropdown(transactionDetails.getMemberAccounts(), transactionDetails.getMemberAccountKey(), transactionsUrl)
Myślisz o to w niewłaściwy sposób. JavaScript jest wykonywany po stronie klienta, a scala jest wykonywany po stronie serwera! Jedynym sposobem na komunikację między nimi w tym kierunku (JavaScript do Scala) jest POST lub GET. –
Tak, masz rację, te instrukcje Scala muszą zostać przetworzone zanim strona zostanie wyrenderowana. Zdecydowanie nie chcę wykonywać wywołania REST tylko po to, aby uzyskać wartość tej trasy. Żałuję, że nie było sposobu, aby zrobić to dynamicznie bez wykonywania połączenia lub twardego kodowania trasy w JS. – Samo
Czy możesz zrobić to częścią routingu? Jak 'location.href = '/ products /' + $ (this) .val();' Następnie obsłuż go w routerze config/controller. Może więcej informacji na temat twojej sprawy pomoże nam znaleźć lepsze rozwiązanie, co w praktyce oznacza "$ (this) .val()"? –