2

所以我需要将 javascript 变量传递给 grails 参数来构建和下载文件。所以最初使用 ajax 只是为了了解 ajax 不进行下载。最初是这样工作的:

<script type="text/javascript" charset="utf-8">
    function myFunction() {

        jQuery.ajax({
            url: "Search/download",
            type: "POST",
            data: {facets: visualSearch.searchQuery.facets()}
        });
    }
</script>
<input type="button" onclick="myFunction()" value="download">

虽然这正确地通过了映射,但这并没有进行下载。

所以现在我想做类似的事情g:link

<g:link controller="Search" action="test" params="[facets: '\$(visualSearch.searchQuery.facets())']" >TEST GRAILS</g:link>

但是我在控制器的参数中得到的只是

facets=$(visualSearch.searchQuery.facets())
action=test
controller=search

如何解决此问题以将方面(无论是已解析还是未解析)传递到控制器中。谢谢!

4

3 回答 3

3

添加您的 javascript 变量params将不起作用。在g:link服务器端执行并且不知道您的 javascript 值。您可以删除它params,而是在链接的“onclick”事件中添加代码,以在参数中设置您的 javascript 值。

类似于:在 gsp 页面中,

<g:link name="searchLink" controller="Search" action="test">TEST GRAILS</g:link>

然后在javascript中(在同一页面中),

$(function() {
  $('a[name="searchLink"]').bind('click', function() {
    $(this).attr('href', $(this).attr('href') + '?facets=' + visualSearch.searchQuery.facets());
  })
})

基本上,您使用 Grails 生成超链接,然后使用 JQuery 将带有参数的查询字符串附加到该 href

希望有帮助。

于 2013-08-19T17:27:56.457 回答
1

在这些情况下,我倾向于使用g:link生成 URL,然后使用 jQuery 覆盖默认行为以进行 ajax 调用:

<g:link class="searchLink" controller="Search" action="test" params="[facets: '\$(visualSearch.searchQuery.facets())']" >TEST GRAILS</g:link>

$('.searchLink').on('click', function(e) {
  e.preventDefault(); // prevent default link behavior

  var $element = $(this);
  var url = $element.prop('href');

  $.post(url, function(data) { 
    // callback if you need it
  });
});
于 2013-08-19T18:37:34.613 回答
0

从你所拥有的我认为你应该创建一个表单并在点击事件中提交它:

<script type="text/javascript" charset="utf-8">
    function myFunction() {
        $('<form>', {
            "html": '<input type="text" name="facets" value="' + visualSearch.searchQuery.facets() + '" />',
            "action": '${createLink(controller: "Search", action: "test")}',
            "method": 'POST'
        }).appendTo(document.body).submit();
    }
</script>
<input type="button" onclick="myFunction()" value="download">

或者重构您的代码以获得真正的 html 表单并在提交之前为其准备数据。

于 2013-08-20T07:05:13.337 回答