Как мне получить доступ к переменной из JavaScript и Grails? - PullRequest
1 голос
/ 10 октября 2010

У меня есть переменная Grails , которая имеет тип JASONList, который отображается в шаблоне.

Есть ли способ получить доступ к этому списку из функции JavaScript?

Допустим, я хочу, чтобы размер файла соответствовал всем объектам на экране. Без вызова базы данных и повторного получения всего списка из Ajax ...

Допустим, шаблон делает что-то вроде этого:

<g:each var="report" in="${reportList?.myArrayList}">
  <li style="display:inline; list-style:none;">
    <img src="  ${report?.img}">
  </li>
</g:each>
<script type="text/javascript">
    function resize(list) {
        if (list.size <givenSize) // Pseudocode
            list.subList() // Pseudocode
    }
    window.onresize = resize("${reportList}")
</script>

Проблема в том, что по какой-то причине Grails gsp не отображает «$ {reportList}» в виде списка. Вместо этого он отображает его как строку "$ {reportList}".

Возможно, я думаю об этой проблеме совершенно неправильно, но есть ли способ изменить размеры этих объектов или получить их через document.getElementById или что-то в этом роде?

$ reportList заполняется POJO как преобразование JSON ...

Ответы [ 4 ]

4 голосов
/ 10 октября 2010

Переменные Grails существуют только на стороне сервера. JavaScript работает в браузере (на стороне клиента). Все, что отправлено в браузер, является строкой, поэтому, хотя вы можете использовать Grails для создания фрагмента JavaScript, например window.onresize = resize("${reportList}"), браузер увидит только строку , которую ${reportList} оценивает.

Это означает, что если вы используете Grails для передачи переменной в функцию resize() JavaScript, параметр (list) будет только когда-либо строкой - вы не сможете получить доступ к методам списка на стороне сервера как list.size или list.subList(), потому что переменная list является больше не список; это просто строка .

0 голосов
/ 15 октября 2010

Я разобрался в своей проблеме.В основном, если вы используете POJO в Grails, Grails, поскольку преобразование JSON не очень разумно.Все, что он делает, - это toString объекта вместо того, чтобы потенциально просматривать все открытые средства доступа и т. Д.

Это несколько разочаровывает, но в основном мне нужно создать преобразование JSON в методе toString моего POJO.

0 голосов
/ 11 октября 2010

Я не уверен, почему ваш $ {reportList} отображается как $ {reportList}, потому что, когда я делаю следующее:

var t = "${taskList}";

, я получаю следующее в своем HTML:

var t = "[com.wbr.highbar.Task : 1, com.wbr.highbar.Task : 4, com.wbr.highbar.Task : 2, com.wbr.highbar.Task : 5]";

Тем не менее, у вас все еще будут проблемы, потому что JavaScript не будет знать, что делать с вашим reportList.Если это чистый JSON, вам понадобится eval (), чтобы он превратился в объект JavaScript.

0 голосов
/ 10 октября 2010

Не знаю, но, возможно, Grails не хочет оценивать выражения внутри тегов script.Динамически генерируемые сценарии не очень хорошая практика.

Но пока вы не найдете точную причину, вы можете попробовать что-то вроде этого:

<g:each var="report" in="${reportList?.myArrayList}">
  <li style="display:inline; list-style:none;">
    <img src="  ${report?.img}">
  </li>
</g:each>
<%= """<script type=\"text/javascript\">
function resize(list){
  if(list.size <givenSize) //posudo code
     list.subList() // psudocode
}

window.onresize = resize(\"$reportList\")
</script>""" %>
...