2012-05-22 10 views
6

No estoy seguro de cómo se hace esto. Podría codificar la ruta que trato de usar, pero me gustaría hacerlo de la manera correcta.Mezcla de JavaScript y Scala en una plantilla de Play

Tengo un menú desplegable que necesita cargar una nueva página en el cambio. Aquí es básicamente cómo estoy tratando de hacerlo (lo he intentado un par de variaciones de este):

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

Esto produce una excepción identifier expected but 'val' found. También traté de rodearlo entre comillas, pero eso causa un [NumberFormatException: For input string: "$(this).val()"]

Entonces, ¿cómo diablos puedo insertar un valor de JavaScript en una función de Scala?

Editar

aquí está mi solución, inspirada en la respuesta aceptada. Este menú desplegable se define en una etiqueta que está hecha para ser reutilizada por diferentes componentes, y la URL base es diferente para cada componente. La manera de lograr esto iba a pasar por una función que genera una URL basado en una clave de cuenta en el menú desplegable:

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

A continuación, se puede definir una función como esta para pasar en:

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

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

Estás pensando en esto por el camino equivocado. JavaScript se ejecuta en el lado del cliente, mientras que Scala se ejecuta en el lado del servidor. La única forma de comunicarse entre los dos en esa dirección (JavaScript a Scala) es con un POST o GET. –

+0

Sí, tiene razón, esas declaraciones de Scala deben procesarse antes de que la página se represente. Definitivamente no quiero hacer una llamada REST solo para obtener el valor de esa ruta. Ojalá hubiera alguna manera de hacer esto de forma dinámica sin hacer una llamada o codificar la ruta en JS. – Samo

+0

¿Puedes hacer que forme parte del enrutamiento? Al igual que 'location.href = '/ products /' + $ (this) .val();' Luego, manejarlo en la ruta config/controller. Tal vez más sobre los detalles de su caso nos ayuden a encontrar una mejor solución, ¿qué es "$ (this) .val()" en la práctica? –

Respuesta

6

Usted necesita una forma de almacenar todas las URL en la página, por ejemplo

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

Entonces onChange, puede:

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

¡Excelente idea! Acabo de tener un gran momento "por qué diablos no pensé en eso". – Samo

+0

No veo ninguna razón por la que no funcionaría, pero aún me gustaría intentarlo primero para asegurarme de que no haya ningún problema, y ​​todavía no he tenido la oportunidad. Si lo intento y funciona, entonces obtendrás tu tic verde y tus 15 puntos :-) – Samo

+0

¡Muy bien, gracias! –

Cuestiones relacionadas