Присвоение массива строк переменной js для автозаполнения в play?

#javascript #playframework

#javascript #playframework

Вопрос:

У меня есть переменная js в index.html файл, и я хочу выполнить присвоение, подобное этому:

 var names=["${stateNames}"];
  

где stateNames — это список Java, содержащий имена состояний. Как мне выполнить назначение, подобное приведенному выше, чтобы в names теперь были все имена состояний, содержащиеся в stateNames ? Переменная stateNames передается в index.html из контроллера воспроизведения.

Есть ли какой-либо способ сделать вышеописанное??

Ответ №1:

Если вы используете шаблоны Groovy, это тривиально, потому что у вас есть доступ к методам сбора данных Groovy:

 var names=[${stateNames.collect{'"' it '"'}.join(",")}];
  

collect преобразует вашу коллекцию, join создает одну большую строку, разделенную заданной строкой.

Версия Scala для полноты картины:

 var names = [@(stateNames.map{"""   _   """}.mkString(","))];
  

Ответ №2:

Существует ряд различных опций, которые вы можете использовать здесь.

  1. Самым удобным вариантом было бы создать JavaExtension, который выводил бы список, разделенный запятыми.
  2. Вы могли бы просто выполнить итерацию по списку и использовать обозначение array.push(), чтобы добавить каждое значение в ваш массив имен.
  3. Вы могли бы использовать тег script для итерации по вашему списку и вывода значений

Вариант 1, вам нужно будет создать класс, подобный приведенному ниже

 package ext;

import play.templates.JavaExtensions;
import java.util.*;

public class MyExtensions extends JavaExtensions {

  public static String stringifyList(List list) {
     StringBuffer buff = new StringBuffer();
     for (Object item: list) {
        buff.append("'" item.toString() "'" ",");
     }

     return buff.toString();
  }

}
  

Затем вы бы просто использовали это, используя JavaExtension в вашем представлении, так что

 var names=[${list.stringifyList()}];
  

Варианты 2 и 3 подробно описаны ниже

 <script type="text/javascript">

   // option 2
   var names = new Array();
   #{list items:list, as:'item'}
    names.push('${item}');
   #{/list}

   // option 3
   var names2 = [%{ 
    for (String item: list) {
        out.print("'" item "'" ",");
    }
   }%]

</script>