9

Is there a simpler way of doing this?

 $(document).ready(function () {
        var jsArray = []
        @if(scalaList != null) {
            @for(id <- scalaList) {
            jsArray.push('@id');
           }
        }
    ...
    }

4 Answers 4

9

It's as simple as the following:

import play.api.libs.json.Json

val jsArr: JsValue = Json.toJson(scalaList)

You can also do that within a template:

@(list: List[Any])

@import play.api.libs.json.Json

<script type="text/javascript">
    $(document).ready(function () {
        var jsArr = @Json.toJson(list);
        console.log(jsArr);
    });
</script>
Sign up to request clarification or add additional context in comments.

2 Comments

I get the output like this: var jsArr = [&quot;xxxx&quot;,&quot;yyyy&quot;]; instead of actual quotes.
It should be @Html(Json.stringify(Json.toJson(list)))
3

You can use mkString for this.

  $(document).ready(function () {
    var jsArray = @if(scalaList != null) {
      [ @scalaList.mkString(",") ]} 
    else {[]};
  }

You should omit this if statement in view. Instead of this, check null in controller and put empty list to view, so this code can be more simpler in view

 $(document).ready(function () {
    var jsArray = [ @scalaList.mkString(",") ];
 }

You don't need this quotes ' ' around id. In javascript 1 == '1' is true

Comments

2

Have you tried something like:

var jsArray = new Array(@scalaList.map(x => "\"" + x + "\"").mkString(","));

or you can use a literal like

var jaArray = [    var jsArray = [@scalaList.map(x => "\"" + x + "\"").mkString(",")];

Also the if check is not required. For comprehensions are smart like that

$(document).ready(function () {
    var jsArray = [@scalaList.map(x => "\"" + x + "\"").mkString(",")];
    ...
}

Comments

2

I think every answer are good but still not safe because every answers don't care about value which including ' or ". Fortunately play framework support json, so you should use json to convert to javascript array.

 @(json: String)
 <html>
 <head>
 </head>
 <body>
 <script>
 var json = @Html(json);
 var list = json.list;
 </script>
 </body>
 </html>
 package controllers

 import play.api._
 import play.api.libs.json._
 import play.api.mvc._

 object Application extends Controller {

   def index = Action {
     val list = List( "hoge\"hoge", "moge'mo\"ge" )
     val json = Json.stringify( Json.obj( 
       "list" -> JsArray( list.map( JsString(_) ) )
     ))
     Ok(views.html.index(json))
   }

 }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.