#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:
Существует ряд различных опций, которые вы можете использовать здесь.
- Самым удобным вариантом было бы создать JavaExtension, который выводил бы список, разделенный запятыми.
- Вы могли бы просто выполнить итерацию по списку и использовать обозначение array.push(), чтобы добавить каждое значение в ваш массив имен.
- Вы могли бы использовать тег 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>