Grails Resources插件和AJAX加载了javascript

时间:2012-01-05 00:55:16

标签: javascript ajax grails grails-plugin

我在grails 1.3.7应用程序中添加了resources插件,除了异步加载的javascript外,一切正常。

所以,如果我有一个包含

的模板
<r:script>
    // javascript here
</r:script>

并通过ajax加载js代码不执行,我收到此错误:

  

看起来您缺少对r:layoutResources标记的一些调用

这是有道理的,因为页面已经被渲染,并且没有r:layoutResources来处理新添加的r:script js代码。

我发现的唯一解决方法是添加 {/ 1}} 在异步呈现内容的控制器操作中的实际render r.layoutResources(disposition:"defer")

还有其他更明确的解决方案吗?

3 个答案:

答案 0 :(得分:18)

更好的方法是为您的AJAX响应设置专用布局:

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

如果您使用的是Grails 2.0,则可以在render方法(render template: "...", layout: "ajax")中指定布局。否则,按惯例使用布局。

答案 1 :(得分:4)

我认为更好的选择是不在模板片段中使用r:script。只需使用普通的脚本标记。如果您不需要layoutResources,那么您不会从这些片段中的资源中获得任何好处。

有时候经典的方式是最好的。

答案 2 :(得分:1)

我总是和Peter Ledbrook一起回应,但是我没有使用布局,而是使用模板,然后自动化在主布局中渲染的内容。我的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内。