Плагин ресурсов Grails и загруженный javascript AJAX
Я добавил плагин resources в приложении grails 1.3.7, и все работает отлично, за исключением javascript, который загружается асинхронно.
Итак, если у меня есть шаблон, содержащий
<r:script>
// javascript here
</r:script>
и загрузите его через ajax, код js не выполняется, и я получаю эту ошибку:
Похоже, что вам не хватает некоторых вызовов тега r: layoutResources
что имеет смысл, потому что страница уже была отображена, и нет r: layoutResources для обработки недавно добавленного кода r: script js.
Единственное обходное решение, которое я нашел, - это добавить
render r.layoutResources(disposition:"defer")
после фактического render(template:...)
в действиях контроллера, которые отображают контент асинхронно.
Есть ли еще более четкое решение?
Ответы
Ответ 1
Лучшим подходом было бы иметь выделенный макет для ваших ответов AJAX:
<g:layoutBody/>
<r:layoutResources disposition="defer"/>
Если вы используете Grails 2.0, вы можете указать макет в методе рендеринга (render template: "...", layout: "ajax"
). В противном случае используйте макет по соглашению.
Ответ 2
Лучший вариант, я думаю, не использовать r: script в вашем фрагменте шаблона. Просто используйте обычный тег script. Вы не получаете никакой пользы от ресурсов внутри этих фрагментов, если вам не нужен материал layoutResources.
Иногда классический способ - лучший.
Ответ 3
Я всегда встречаюсь с ответом Питера Ледбрука, но вместо того, чтобы использовать макет, я использую шаблон, и я автоматизирую, что делать в основном макете. Мой main.gsp выглядит следующим образом:
<!DOCTYPE html>
<g:if test="${request.xhr}">
<g:render template="/layouts/content" />
</g:if>
<g:else>
<html>
... <!-- Main layout stuff: application resources, logo, main menu, etc -->
<div id="content"> <!-- Somewhere in the body -->
<g:render template="/layouts/content" />
</div>
</html>
</g:else>
Затем шаблон _content.gsp выглядит так:
<g:layoutBody />
<r:layoutResources disposition="defer"/>
<!-- Ajaxify your relative links with the framework of your choice -->
Таким образом, я могу автоматически ajaxify все относительные ссылки и формы, и в контроллере не требуется никаких действий (никаких разных ответов), поскольку ответ ajax всегда проходит внутри содержимого div.