【问题标题】:Grails Resources Plugin and AJAX loaded javascriptGrails 资源插件和 AJAX 加载的 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:...) 在异步呈现内容的控制器操作之后。

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

【问题讨论】:

    标签: javascript ajax grails grails-plugin


    【解决方案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 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 -->
    

    这样,我可以自动对所有相关链接和表单进行 ajax 化,并且不需要在控制器中执行任何操作(没有不同的响应),因为 ajax 响应总是在内容 div 内。

    【讨论】:

    • 顺便说一句,我通常使用自己的 ajaxify 函数来 ajaxify 所有相关链接...以防万一有人感兴趣:github.com/deigote/ajaxify
    猜你喜欢
    • 2012-02-23
    • 2014-03-17
    • 2015-12-16
    • 1970-01-01
    • 2015-03-21
    • 2012-02-18
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多