Grails 资源插件和 AJAX 加载的 javascript
Posted
技术标签:
【中文标题】Grails 资源插件和 AJAX 加载的 javascript【英文标题】:Grails Resources Plugin and AJAX loaded javascript 【发布时间】:2012-02-02 21:50:21 【问题描述】:我在 grails 1.3.7 应用程序中添加了 resources 插件,除了异步加载的 javascript 之外,一切正常。
所以如果我有一个包含一个模板
<r:script>
// javascript here
</r:script>
并通过ajax加载它,js代码不执行,我得到这个错误:
您似乎缺少对 r:layoutResources 标记的一些调用
这是有道理的,因为页面已经渲染并且没有 r:layoutResources 来处理新添加的 r:script js 代码。
我发现的唯一解决方法是添加
render r.layoutResources(disposition:"defer")
在实际的 render(template:...)
在异步呈现内容的控制器操作之后。
还有其他更明确的解决方案吗?
【问题讨论】:
【参考方案1】:更好的方法是为您的 AJAX 响应提供专用布局:
<g:layoutBody/>
<r:layoutResources disposition="defer"/>
如果您使用的是 Grails 2.0,您可以在 render 方法中指定布局 (render template: "...", layout: "ajax"
)。否则,请按约定使用布局。
【讨论】:
非常有用的信息!我已经在 docs 中寻找过类似的东西,但是从 2.0.3 开始,render 标签没有“layout”属性。 我认为这是最好的方法。 不错的解决方案,仍然抛出错误,但在 html 源代码中正在打印所需的模块。现在的问题是评估该脚本标签,因为它们仍然不起作用。甚至将脚本标签传递给 eval 函数。 我解决了。如果您添加的 javascript 不起作用,请查看 this 答案。【参考方案2】:我认为更好的选择是不要在模板片段中使用 r:script。只需使用普通的脚本标签。如果您不需要 layoutResources 的东西,您不会从这些片段中的 Resources 获得任何好处。
有时经典的方式是最好的。
【讨论】:
如果我使用经典脚本标签,在初始页面加载时 js 代码将不会执行,因为它依赖于页面底部加载的库(jQuery 等)(我不'不想将它们加载到头部)。 jQuery 通常应该处于头部状态并且无论如何都要先执行。您在此处的所有解决方案都将非常棘手,因为您正在有效地返回动态脚本片段,这不是资源的设计目的。这种方法似乎给您带来了一些问题,但如果您希望继续使用它,我建议您不要在首先提供的主 GSP 中使用 Resources 标签。【参考方案3】:我总是使用 Peter Led*** 的响应,但我不使用布局,而是使用模板并自动在主布局中呈现什么。我的 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 响应总是在内容 div 内。
【讨论】:
顺便说一句,我通常使用自己的 ajaxify 函数来 ajaxify 所有相关链接...以防万一有人感兴趣:github.com/deigote/ajaxify以上是关于Grails 资源插件和 AJAX 加载的 javascript的主要内容,如果未能解决你的问题,请参考以下文章
用于渲染图像的 Grails Resources 插件、模块和 <r:img>?
Grails Spring Security 插件:Getting 302 for Ajax Request for timeout Session