2012-05-22 22 views
6

Tôi không chắc chắn cách thực hiện điều này. Tôi có thể mã hóa con đường tôi đang cố gắng sử dụng, nhưng tôi muốn làm điều này đúng cách.Trộn JavaScript và Scala trong mẫu Play

Tôi có một menu thả xuống cần tải trang mới về thay đổi. Về cơ bản đây là cách tôi đang cố gắng làm điều đó (Tôi đã thử một vài biến thể này):

@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> 

Điều này tạo ra một ngoại lệ identifier expected but 'val' found. Tôi cũng đã cố gắng bao quanh nó trong dấu ngoặc kép, nhưng điều đó gây ra một [NumberFormatException: For input string: "$(this).val()"]

Vậy làm cách nào để tôi chèn một giá trị từ JavaScript vào hàm Scala?

Sửa

Đây là giải pháp của tôi, lấy cảm hứng từ câu trả lời chấp nhận. Trình đơn thả xuống này được định nghĩa trong thẻ được tạo để sử dụng lại bởi các thành phần khác nhau và URL cơ sở khác nhau cho mỗi thành phần. Các cách để đạt được điều này là để vượt qua một chức năng mà tạo ra một URL dựa trên một khoá tài khoản vào thả xuống:

@(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> 

Sau đó, bạn có thể định nghĩa một hàm như thế này để vượt qua trong:

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

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

Bạn đang nghĩ về điều này một cách sai lầm. JavaScript được thực hiện ở phía máy khách, trong khi scala được thực hiện ở phía máy chủ! Cách duy nhất để giao tiếp giữa hai hướng đó (JavaScript đến Scala) là với POST hoặc GET. –

+0

Vâng, bạn nói đúng, những câu lệnh Scala cần được xử lý trước khi trang được hiển thị. Tôi chắc chắn không muốn thực hiện một cuộc gọi REST chỉ để có được giá trị của tuyến đường đó mặc dù. Tôi muốn có một số cách để làm điều này tự động mà không thực hiện cuộc gọi hoặc hardcoding các tuyến đường trong JS. – Samo

+0

Bạn có thể biến nó thành một phần của định tuyến không? Giống như 'location.href = '/ products /' + $ (this) .val();' Sau đó xử lý nó trong route/controller route. Có thể thêm chi tiết về trường hợp cụ thể của bạn sẽ giúp chúng tôi tìm ra giải pháp tốt hơn, "$ (this) .val()" trong thực tế là gì? –

Trả lời

6

Bạn cần một cách để lưu trữ tất cả các URL trong trang, ví dụ

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

Sau đó onChange, bạn có thể:

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

Ý tưởng tuyệt vời! Tôi vừa mới có một "lý do tại sao tôi không nghĩ đến chuyện đó". – Samo

+0

Tôi không thấy lý do tại sao nó sẽ không hoạt động, nhưng tôi vẫn muốn thử nó đầu tiên để đảm bảo không có gotchas, và tôi đã không có cơ hội được nêu ra. Nếu tôi thử nó và nó hoạt động, sau đó bạn sẽ nhận được đánh dấu màu xanh lá cây của bạn và 15 điểm của bạn :-) – Samo

+0

Công bằng đủ - cảm ơn bạn! –

Các vấn đề liên quan