admin管理员组

文章数量:1417459

So I need to pass javascript variables into grails parameters to build and download a file. So initially did this with ajax just to learn that ajax doesn't do downloads. Initially this worked like so:

<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">

While this passed the mapping correctly, this didn't do downloads.

So now I am want to do something similar with a g:link

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

But all I get in the params in the controller are

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

How can I fix this to pass the facets (whether parsed or unparsed) into the controller. Thanks!

So I need to pass javascript variables into grails parameters to build and download a file. So initially did this with ajax just to learn that ajax doesn't do downloads. Initially this worked like so:

<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">

While this passed the mapping correctly, this didn't do downloads.

So now I am want to do something similar with a g:link

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

But all I get in the params in the controller are

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

How can I fix this to pass the facets (whether parsed or unparsed) into the controller. Thanks!

Share Improve this question asked Aug 19, 2013 at 17:04 BadmiralBadmiral 1,5894 gold badges38 silver badges77 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 3

Adding your javascript variable in params will not work. The g:link is executed on the server side and has no knowledge of your javascript values. You can remove this params and instead add code on the `onclick' event of your link to set your javascript values in the params.

Something like: In the gsp page,

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

and then in javascript (in the same page),

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

Basically you are using Grails to generate the hyperlink and then using JQuery to append a query string with the parameters to that href

Hope that helps.

What I tend to do in these cases is use the g:link to generate the URL, but then override the default behavior with jQuery to make the ajax call:

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

From what you have I think you should create a form and submit it in the click event:

<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">

Or refactor your code to have a real html form and prepare the data for it before submit.

本文标签: pass javascript variables into grails paramsStack Overflow