2012-05-22 5 views
6

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

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

+0

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

+0

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

Antwort

6

Sie benötigen eine Möglichkeit, alle URLs auf der Seite zu speichern, z

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

Dann onChange können Sie:

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

Ausgezeichnete Idee! Ich hatte gerade einen wichtigen "warum zur Hölle habe ich nicht an diesen" Moment gedacht. – Samo

+0

Ich sehe keinen Grund, warum es nicht funktionieren würde, aber ich möchte es immer noch versuchen, um sicherzustellen, dass es keine Probleme gibt, und ich hatte noch keine Chance. Wenn ich es versuche und es funktioniert, dann bekommst du deinen grünen Tick und deine 15 Punkte :-) – Samo

+0

Fair genug - danke! –

Verwandte Themen