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(),
        }
    });
});

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

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

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

我能做些什么?

选项:

  • 将 Javascript 片段放在g:javascript页面内的标记中(有点丑,因为它有点内联)
  • 使用相对 URL(不是很健壮)
  • 开始工作(如何remoteFunction使用 jQuery?)
  • 还要别的吗?
4

1 回答 1

0

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

myapp.urls['mappingName'] = url

出现2个问题:

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

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

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

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

它并不完美,但它有效。

于 2012-03-21T04:13:19.390 回答