Я только что обновился до Grails 2.4 и использую подключаемый модуль Asset-Pipeline1.8.7. Мне интересно, как получить доступ к изображениям из Javascript. Я использую API Google Maps Javascript V3, и мне нужно установить некоторые значки маркеров в Javascript. Есть ли способ создать некоторые переменные Javascript на GSP с помощью тега, а затем получить доступ к файлу в моем коде app.js? Если это невозможно, как сделать ссылку на скомпилированные изображения в активах?
Как получить доступ к изображениям из Javascript с помощью подключаемого модуля Grails Asset-Pipeline?
Ответы (4)
Вы можете определить глобально доступный объект, который содержит корневой путь к каталогу ваших ресурсов, и использовать его для создания URL-адресов ваших ресурсов. Добавьте этот фрагмент в заголовок вашего макета
<g:javascript>
window.grailsSupport = {
assetsRoot : '${ raw(asset.assetPath(src: '')) }'
};
</g:javascript>
Затем используйте его в другом месте, например:
<g:javascript>
var pathToMyImg = window.grailsSupport.assetsRoot + 'images/google_maps_marker.png';
</g:javascript>
Обновление от 06 августа 2015 г.
Просматривая примечания к выпуску плагина asset-pipeline, я заметил, что не -digest-версии активов больше не хранятся в WAR-файле. Это будет означать, что предлагаемое мной решение не работает, когда приложение развертывается как WAR:
31 мая 2015 г. Выпуск 2.2.3. Больше не сохраняются версии без дайджеста в файле war, что сокращает накладные расходы вдвое. Также удалена зависимость ввода/вывода Commons. Более быстрый поток байтов.
Это означает, что вы должны заранее явно определить все свои изображения и больше не можете динамически создавать путь в своих скриптах:
<g:javascript>
window.grailsSupport = {
myImage1 : '${assetPath(src: 'myImage1.jpg')}',
myImage2 : '${assetPath(src: 'myImage2.jpg')}'
};
</g:javascript>
Обновление от 25 мая 2016 г.
Теперь можно указать, будут ли не-дайджест версии активов включены в созданный war-файл, установив grails.assets.skipNonDigests
(по умолчанию false
):
Обычно нет необходимости отключать «skipNonDigests». Tomcat по-прежнему будет автоматически обслуживать файлы по имени, не являющемуся дайджестом, и будет копировать их, используя storagePath через карту псевдонимов
manifest.properties
. Это просто сокращает хранилище вдвое. Однако, если вы пытаетесь выполнить такие действия, как загрузка на cdn вне плагина cdn-asset-pipeline и через содержимое target/assets. Это все еще может быть полезно.
Обратите внимание, что вы по-прежнему можете использовать предлагаемое решение для предварительного определения всех необходимых изображений, чтобы обойти проблемы с кэшированием в браузере (поскольку дайджест-версия актива имеет хеш содержимого в имени файла).
Да, вы можете, поставив ${assetPath(src: 'img.png')}
в свой gsp.
Я не знаю, какое идеальное решение в вашем случае, но решение может быть таким:
- Используйте относительные пути, такие как «../assets/use-control.png», в вашем коде js.
- Добавьте img в свой дом и укажите ссылку на него из кода js.
- Добавьте атрибут
data-imgpath="${asset.assetPath(src: 'use-control.png')}"
к соответствующему элементу в вашем доме и используйте эту ссылку.
В качестве альтернативы вы можете использовать атрибут data-* HTML5.
Здесь я объяснил немного подробнее: загружать изображения из javascript
${resource(dir:"", file:"")}
? - person wwarlock   schedule 09.06.2014./grails-app/assets/stylesheets/style.css
И я использую его в коде:assetPath(src: "stylesheets/style.css")
или в качестве тэга в представлении:<asset:stylesheet src="style.css"/>
То же самое с ресурсом - person wwarlock   schedule 10.06.2014