Плагин Grails Resources и загруженный AJAX JavaScript - PullRequest
17 голосов
/ 05 января 2012

Я добавил плагин resources в приложение Grails 1.3.7, и все работает отлично, кроме JavaScript, который загружается асинхронно.

Так что, если у меня есть шаблон, который содержит

<r:script>
    // javascript here
</r:script>

и загрузить его через ajax код js не выполняется, и я получаю эту ошибку:

Похоже, вам не хватает некоторых вызовов тега r: layoutResources

, что имеет смысл, поскольку страница уже отрисована, и отсутствует r: layoutResources для обработки недавно добавленного кода j: r: script.

Единственный найденный мной обходной путь - добавить render r.layoutResources(disposition:"defer") после фактического render(template:...) в действиях контроллера, которые визуализируют содержимое асинхронно.

Есть ли другое более ясное решение?

Ответы [ 3 ]

18 голосов
/ 06 января 2012

Лучшим подходом было бы иметь выделенный макет для ваших ответов AJAX:

<g:layoutBody/>
<r:layoutResources disposition="defer"/>

Если вы используете Grails 2.0, вы можете указать макет в методе рендеринга (render template: "...", layout: "ajax"). В противном случае используйте макет по соглашению.

4 голосов
/ 06 января 2012

Я думаю, что лучше не использовать r: script в вашем фрагменте шаблона. Просто используйте обычный скрипт-тег. Вы не получите никакой выгоды от ресурсов внутри этих фрагментов, если вам не нужны материалы layoutResources.

Иногда классический способ - лучший.

1 голос
/ 03 мая 2013

Я всегда иду с ответом Питера Ледбрука, но вместо использования макета я использую шаблон и автоматизирую то, что нужно визуализировать в основном макете.Мой 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 -->

Таким образом, я могу автоматически отрегулировать все относительные ссылки и формы иникаких действий в контроллере не требуется (никаких других ответов), так как ответ ajax всегда идет внутри div содержимого.

...