Подтвердить что ты не робот

Плагин ресурсов 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:...) в действиях контроллера, которые отображают контент асинхронно.

Есть ли еще более четкое решение?

4b9b3361

Ответ 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.