我在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")
。
还有其他更明确的解决方案吗?
答案 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内。