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 Spring 安全插件 AJAX 身份验证

Ajax 未定义 - Grails jQuery 插件

用于渲染图像的 Grails Resources 插件、模块和 <r:img>?

Grails Spring Security 插件:Getting 302 for Ajax Request for timeout Session

Grails - 如何使用 ajax 加载模板?

创建和安装 grails 插件 - 在安装期间/安装后,我的插件如何从依赖的插件访问资源?