Grails: файлы Javascript в папке представлений - PullRequest
3 голосов
/ 20 июня 2009

Я бы хотел разделить свои представления в Grails на 2 файла: файл .gsp и файл .js, чтобы получить более чистое разделение Javascript от моих представлений. Итак, вот пример:

views/index.gsp
views/index.js
views/home/index.jsp
views/home/index.js

Но когда я просто добавляю ссылку на скрипт index.js следующим образом:

<script src="index.js" type="text/javascript"></script>

все, что я получаю, это 404.

Кто-нибудь знает, как с этим бороться?

Большим преимуществом было бы иметь возможность использовать данные представления в файле index.js для создания желаемого контента.

Matthias.

Ответы [ 4 ]

4 голосов
/ 21 июня 2009

На самом деле, вполне возможно, что JS-файл (или файл любого другого типа) должен быть в качестве GSP из вашего каталога grails-app/views/. Единственное, что вам нужно сделать, это определить подходящее сопоставление URL для этих GSP, например ::10000

"/javascript/home/index"(view:'/home/index.js')

С этим отображением URL вы можете поместить свой JS-код в grails-app/views/home/index.js.gsp (обратите внимание на конечный .gsp) и можете использовать любые теги grails в вашем JS-источнике. Чтобы обеспечить доставку вашего JS с правильным типом контента, вы можете разместить

<%@ page contentType="text/javascript"%>

в начале вашего GSP.

К сожалению, тег createLink не поддерживает перезапись ссылок на представления, но для создания этих ссылок должно быть легко написать собственный тег.

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

0 голосов
/ 25 июня 2009

Я не думаю, что вам разрешен доступ к js внутри представлений /

если вам нужно это сделать ... вот трюк

  1. создайте свой js и переименуйте его с помощью myjs.gsp (используйте "") iniside _myjs.gsp введите вы JS
... запишите, вы JS здесь ...
  1. внутри вас gsp (например: index.gsp, view.gsp и т. Д.) введите этот тег, чтобы загрузить вас JS

0 голосов
/ 21 июня 2009

Идея хорошая, но у Grails такая структура каталогов по какой-то причине. Папка просмотра предназначена для определенного типа артефакта (просмотров) ..

Вы можете клонировать свою структуру папок вида в web-inf, но это дает вам больше работы, так как я думаю, что идея заключается в том, чтобы держать связанные файлы близко друг к другу по соображениям удобства.

Несмотря на то, что мне не очень интересно хранить Javascript вместе с представлением, мне понравилась идея Роберта подключиться к процессу сборки, используя события сборки для копирования исходных текстов javascript в правильный каталог! Если вы решите пойти по этому пути, вы можете сжимать источники, пока вы там. ShrinkSafe - популярная библиотека.

0 голосов
/ 21 июня 2009

Обновление 2:

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

Можно написать обработчик событий, который синхронизирует все файлы javascript из grails-app/views с целевой папкой web-app/js.

Поместите пользовательский код в $ PROJECT / scripts / Events.groovy. PackagingEnd является хорошей целью для вызова, так как это происходит сразу после генерации web.xml.

eventPackagingEnd = {  ->
     // for each js file under grails-app/views move to web-app/js
}

Обновление

Если вы хотите, чтобы файлы javascript просто «сцеплялись» вместе, вы можете сделать это с помощью символических ссылок, например ::

grails-app / views / view1 / index.js -> webapp / js / view1 / index.js

Насколько я знаю, нет никакого способа заставить граалы напрямую обслуживать контент, находящийся вне веб-приложения.

В качестве альтернативы вы можете встроить свой javascript, но это может повлиять на производительность.


Файлы Javascript относятся к web-app/js.

Затем вы можете ссылаться на них, используя <g:javascript src="index.js" />.

...