Выполнение groovy операторов в источниках JavaScript в Grails - PullRequest
7 голосов
/ 08 января 2009

В сущности, есть 2 места для определения функций JavaScript в Grails, непосредственно в элементе в GSP и в отдельном исходном файле javascript в / web-app / js (например, application.js). Мы определили обычно повторно используемую функцию javascript в application.js, но мы также должны иметь возможность динамически генерировать части функции, используя отличный код. К сожалению, $ {some groovy code} не обрабатывается в отдельных исходных файлах javascript.

Это единственный способ сделать это, определив функцию javascript в теге script на странице GSP, или есть более общее решение? Очевидно, что мы могли бы определить функцию javascript в теге script в GSP-файле шаблона, который можно было бы использовать повторно, но необходимо приложить немало усилий, чтобы все наши функции javascript были определены в одном месте (то есть во внешнем исходном файле javascript). Это также имеет преимущества в производительности (исходные файлы javascript обычно просто загружаются браузером каждого клиента один раз, вместо того, чтобы перезагружать одни и те же функции javascript в источнике каждой HTML-страницы, которую они посещают). Я поиграл с идеей разбить функцию на статические и динамические части, поместить статические во внешний источник и поместить динамические в шаблон GSP, а затем склеить их вместе, но это кажется ненужным хаком.

Есть идеи?

(править: Это может звучать как идея динамического генерирования частей функции JavaScript, которая затем загружается один раз и используется клиентом снова и снова), это было бы плохой идеей. Однако часть, которая "динамична" «изменяется только один раз в неделю или месяц, а затем очень незначительно. В основном мы просто хотим, чтобы этот фрагмент генерировался из базы данных, даже если только один раз, вместо жестко заданного кода.)

Ответы [ 6 ]

13 голосов
/ 08 января 2009

Простое решение для сохранения ненавязчивого JavaScript - это создать JavaScriptController и отобразить его действия "/ js / *", добавив его в файл UrlMappings.groovy:

"/js/$action"{
  controller = "javascript"
}

, затем просто создайте действие для каждого динамического файла JS, который вы хотите включить в свой макет , и перед этим у вас есть файл JS, в который вы можете вставлять фрагменты Grails! :)

Примечание: Я обнаружил, что в настоящее время в Grails есть ошибка, которая неправильно отображает расширения файлов на типы контента, поэтому вам нужно будет указать <%@ page contentType="text/javascript; UTF-8" %> в верхней части просмотреть файлы.

7 голосов
/ 15 мая 2009

Это отличное решение. Я хотел бы предложить предложение использовать что-то иное, чем отображение

"/js/$action" 
, потому что это больше не позволит вам получить доступ к файлам JavaScript в / web-app / js /. Все ваши файлы JavaScript должны быть перемещены в каталог, на который будет указывать ваш контроллер.

Я бы использовал что-то вроде

"/dynjs/$action"

Таким образом, вы все еще можете указывать на файлы в / web-app / js / files без конфликта и наслаждаться преимуществами тегов gsp в файлах javascript

Пожалуйста, поправьте меня, если я ошибаюсь.

1 голос
/ 15 февраля 2011

Назовите ваши сценарии, как это

/wherever/the/js/files/are/thescript.js.gsp

Код gsp внутри будет корректно отображаться граалями. Это работает, но я понятия не имею, считается ли это Хорошей идеей или нет.

1 голос
/ 14 января 2011

Если вы хотите использовать модели, созданные контроллером (отображаемую HTML-страницу, которая ссылается на Javascript, в котором вы собираетесь использовать код groovy) в коде Javascript, то вы можете использовать эту технику:

Этот метод не требует изменения отображений URL-адресов и не требует создания дополнительного контроллера.

По вашему мнению, GSP добавьте javascript следующим образом:

    <script type="text/javascript">
        <g:render template="/javascript/yourJavascriptFile"/>
    </script>

В папке views создайте папку "javascript". И создайте файл с именем: _yourJavascriptFile.gsp

Вы можете не только использовать весь код GSP в вашем файле _yourJavascriptFile.gsp, но вы также можете использовать все модели, созданные в вашем контроллере (то есть для рендеринга вида).

ПРИМЕЧАНИЕ. В папке javascript нет ничего особенного. Вы можете назвать его как угодно или использовать существующую папку просмотра. Это всего лишь вопрос организации и идентификации вашего GSP с разбрызгиванием HTML из GSP с разбрызгиванием Javascript. Кроме того, вы можете использовать некоторые соглашения об именах, такие как: _something.js.gsp и т. Д.

1 голос
/ 22 января 2009

Или это ... есть метод tag / service / dynamic, который позволяет тегам записывать свои JS + CSS +, что угодно, в «кеш», который используется для создания ресурсов JS + CSS другим контроллером.

Полная концепция здесь: [http://www.anyware.co.uk/2005/2009/01/19/an-idea-to-give-grails-tags-esp/][1]

0 голосов
/ 09 января 2009

Есть еще один способ - передать сгенерированный код в функцию, которая ожидает замыкания. Эти замыкания генерируются программой, конечно. Сгенерированный код, конечно, встроен / помечен на странице gsp.

может работать или не работать в зависимости от характера генерируемого кода. Но я подозреваю, что это сработает, и если этого не произойдет, небольшая настройка стиля кодирования вашего javascript определенно заставит его работать. Хотя, если этот «сгенерированный» код не сильно изменится, это немало убивает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...