2012-05-22 11 views
6

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) 
+1

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. –

+0

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

+0

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()"? –

Odpowiedz

6

Ty potrzebujesz sposobu przechowywania wszystkich adresów URL na stronie, np

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

Następnie onChange można:

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

Doskonały pomysł! Po prostu miałem poważne "dlaczego, do cholery, nie myślałem o tej" chwili. – Samo

+0

Nie widzę powodu, dla którego to by nie zadziałało, ale nadal chciałbym spróbować najpierw, aby upewnić się, że nie ma gotch, a ja jeszcze nie miałem okazji. Jeśli spróbuję i zadziała, otrzymasz swój zielony haczyk i 15 punktów :-) – Samo

+0

Dość uczciwi - dziękuję! –

Powiązane problemy