【问题标题】:URL to controller/action in external Javascript file外部 Javascript 文件中控制器/操作的 URL
【发布时间】:2012-03-19 19:48:20
【问题描述】:

我有一个处理域模型 (A) 编辑的表单。这个域模型还有hasMany其他域模型(B)。所以为了给 A 添加新的 B,我想实现一个自定义的 AJAX 函数,将一些输入字段的参数发送到控制器。

为此,我创建了以下 GSP:

<g:form>
<!-- other stuff concerning entity A -->
    <p>Add B to A</p>
    <input type="text" id="bName" /> <input type="text" id="bSomeProperty" <a href="#" id="addB">Add</a>
</g:form>

并将以下一段 Javascript 添加到我的 main.js 中,由 resources 插件加载。

$("#addB").click(function() {
    $.ajax({
        url: '', // controller: a, action: addB
        dataType: 'json',
        data: {
            bName: $('#bName').val(),
            bSomeProperty: $('#bSomeProperty').val(),
        }
    });
});

所以,问题是:如何检索指向当前控制器和操作addB 的 URL?如果可能的话,我不想对其进行硬编码或使用相对路径——因为 Grails 实际上提供了一些方法来检索链接。

在 Javascript 中使用 remoteFunction 对我不起作用,因为我使用的是 jQuery。两者似乎不能很好地协同工作。

我还发现了这篇关于 Grails、jQuery 和 AJAX 的博客文章 (http://alexduan.com/2011/02/17/grails-jquery-and-ajax/)。他在 javascript 部分中使用了一个变量。不幸的是,contextPath 变量没有被解析,因为 Javascript 不在 GSP 页面中,而是在外部文件中。

我能做什么?

选项:

  • 将 Javascript 片段放在页面内的 g:javascript 标记中(有点难看,因为它有点内联)
  • 使用相对 URL(不是很可靠)
  • 让remoteFunction 工作(如何使用jQuery?)
  • 还有什么?

【问题讨论】:

    标签: jquery grails-2.0


    【解决方案1】:

    我在我的项目中使用您的第一个选项:我将所有映射的子集加载到全局 myapp.urls javascript 对象中,这样

    myapp.urls['mappingName'] = url
    

    出现2个问题:

    • 您必须选择要公开的网址,因为它们会公开

    • 如果您没有为此制作 robots.txt,网络抓取(例如 GoogleBot)将跟随这些链接。

    所以为了增强这个解决方案,我对内联调用进行了 base64 编码,所以我得到了如下所示的内容:

    myapp.urls=eval(base64_decode('gYW55IGNhcm5hbCBwbGVhc3VyZS4=='));
    

    它并不完美,但它确实有效。

    【讨论】:

    • 谢谢!我在main.gsp 中添加了一个全局变量,这样我就可以在所有其他 Javascript 文件中访问contextPath,并自己构建控制器和操作的路径。
    猜你喜欢
    • 2013-07-31
    • 2019-09-22
    • 2012-02-19
    • 2011-06-23
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多