我在grails 1.3.7应用程序中添加了resources插件,除了异步加载的javascript之外,一切都很正常。
因此,如果我有一个包含
<r:script>
// javascript here
</r:script>
并通过ajax加载它,js代码不会执行,我得到了这个错误:
看起来您遗漏了一些对r:layoutResources标记的调用
这是有意义的,因为页面已经呈现,并且没有r:layoutResources来处理新添加的r:script js代码。
我发现的唯一解决办法是在异步呈现内容的控制器操作中,在实际render(template:...)
之后添加render r.layoutResources(disposition:"defer")
。
有没有其他更清晰的解决方案?
发布于 2012-01-06 19:10:49
一种更好的方法是为AJAX响应提供一个专用的布局:
<g:layoutBody/>
<r:layoutResources disposition="defer"/>
如果您使用的是Grails2.0,那么可以在render方法(render template: "...", layout: "ajax"
)中指定布局。否则,按约定使用layout。
发布于 2012-01-06 19:31:02
我认为一个更好的选择是不在模板片段中使用r:script。只需使用普通脚本标记即可。如果您不需要layoutResources的东西,那么您不会从这些片段中的资源中获得任何好处。
有时经典的方法是最好的。
发布于 2013-05-03 16:32:52
我总是使用Peter Ledbrook response,但我不使用布局,而是使用模板,并自动在主布局中呈现什么。我的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化,并且不需要在控制器中执行任何操作(没有不同的响应),因为ajax响应总是放在content div中。
https://stackoverflow.com/questions/8736277
复制相似问题