Вы в основном ответили на свой вопрос: если вы не ссылаетесь на изображения, используя ресурсы, они не обрабатываются.
Лучше всего создать модуль ресурсов, который содержит список всех изображений. Добавьте этот ресурс на страницу.
// grails-app/conf/CarouselResource.groovy
modules = {
carousel {
resource url:'/images/carousel/foo.jpg'
resource url:'/images/carousel/foo.thumbnail.jpg'
...
}
}
тогда в вашем GSP
<r:require module="carousel"/>
Теперь, описание модуля - это DSL, так что вы можете использовать какой-то цикл файлов для автоматического добавления всех файлов, но я не уверен на 100% как. Вы также можете попробовать что-то вроде '/images/carousel/**'
, но в документах не сказано, сработает ли это или нет.
Кроме того, я должен отметить, что если вы используете какой-либо из плагинов для ресурсов на основе кэширования, это не поможет. Затем вам нужно будет вручную вызвать r.img()
и установить его в вашем JavaScript, что-то вроде этого (если это работает):
<r:script>
var images = [
'${r.img(...)}'
];
</r:script>
Это связано с тем, что URL-адреса, созданные с использованием, например, cached-resources , часто являются хешами содержимого файла, чтобы обеспечить долгосрочное кэширование. Они обычно только косвенно связаны с исходным именем файла.
Обновление на основе комментариев ниже:
Для удаленной загрузки общего JS, но с включением изображений, вы можете сделать что-то вроде этого. Поймите, я не знаю ваш код карусели, и вам почти наверняка придется изменить библиотеку карусели для обработки этих изменений.
<r:script>
window.carouselImages = [
{
image: '${r.external(url:'images/carousel/image1.jpg'}.encodeAsJavaScript();}',
thumbnail: '${r.external(url:'images/carousel/image1.thumbnail.jpg'}.encodeAsJavaScript();}'
},
...
];
</r:script>
<r:resource url="js/carousel.js"/>
Затем в carousel.js
вы ссылаетесь на window.carouselImages
, чтобы получить массив изображений. Также должно быть возможно, чтобы он изменил порядок и использовал какой-то метод в carousel.js
для добавления изображений, например:
<r:script>
carousel.addImage('${r.external(url:'images/carousel/image1.jpg'}.encodeAsJavaScript();}', '${r.external(url:'images/carousel/image1.thumbnail.jpg'}.encodeAsJavaScript();}');
...
</r:script>
Вы можете улучшить это, зацикливая список файлов вместо того, чтобы явно кодировать каждое изображение (и пример был приведен в JIRA, который я опубликовал ниже).
Наконец, если вы не собираетесь использовать какие-либо плагины для кэширования или манипулирования файлами (чтобы файлы всегда заканчивались одним и тем же URL-адресом), вы можете просто зациклить файлы внутри контроллера или служебного метода. звонит r.img()
на каждого. Это обеспечит их копирование в каталог static
. Возвращаемое значение из r.img()
можно игнорировать.