外部Javascript文件中控制器/操作的URL

时间:2012-03-19 19:48:21

标签: jquery grails-2.0

我有一个处理域模型编辑的表单(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标记内(有些难看,因为它有些内联)
  • 使用相对网址(不是很健壮)
  • remoteFunction工作(如何使用jQuery?)
  • 其他什么?

1 个答案:

答案 0 :(得分:0)

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

myapp.urls['mappingName'] = url

出现2个问题:

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

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

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

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

它不完美但它有效。