2013-02-06 16 views
0

我需要帮助,试图从g:select语句中获取值并将它们传递给JavaScript函数。发送动态Grails g:为JavaScript选择值

到目前为止,我有按钮

<a href='javascript:void(0)' onclick='runReport("${reportInstance.name}")'>Run Report</a> 

其中要求与

function runReport(reportIn){ 
var url = reportViewerPath + reportDirectory + reportIn + reportSuffix + promptChain; 
window.open(url,'Report Viewer','fullscreen=yes,menubar=yes,status=yes'); 
} 

.js文件来完成这项工程。现在的挑战是我们在主.gsp页面上有g:select语句,但它们的编号是可变的。可能没有,也可能有20个,这取决于最终用户选择的报告。

<g:select id="${prompt.name}" from="${listPromptValues[prompt.name]*.values().collect()}" name="prompt" value="" noSelection="['':'']"/> 

这会生成下拉菜单,其中包含任何提示的值。

如何获取$ {prompt.name}和页面上每个提示的选定值,然后将其传递给.js文件?

理想时runReport()被调用时,它会通过所以reportName,并提示会获得通过的

&Phone=867-5309&City=NewYork&Name=Jenny 

每个url变量将是一个可选的G:选择,所以它也可能是

&City=NewYork&Name=Jenny 

我觉得像这样的Related Stack Overflow question会是正确的轨道。

var prompts = ""; 
$('$prompt.name').change(function() { 

    prompts += $(this).text(); 
    $("a").attr('href', function(i, h) { 
     return h + (h.indexOf('?') != -1 ? "&" : "?") + "selectValue="+val; 

    }); 
}); 

但是,提示必须是全局性的,以便每次出现更改时都不会覆盖它。

编辑:这里是.gsp页面上的DOM对象

<div id="runButton"> 
    <g:form controller="report"> 
     <g:if test="${reportInstance?.id}"> 
      <a href='javascript:void(0)' onclick='runReport("${reportInstance.name}")'>Run Report</a> 
     </g:if> 
    </g:form> 
</div> 

<ol class="property-list report"> 
    <g:if test="${reportInstance?.prompts}"> 
    <hr> 
    <li class="fieldcontain" id="prompt"> 
     <g:each var="prompt" in="${reportInstance.prompts}"> 
       <span id="prompts-label" class="property-label"> 
        <g:message code="report.prompts.label" default="${prompt.description}:" /> 
       </span> 
       <g:if test="${prompt.datatype.type == 'DropDown'}"> 
        <g:select id="${prompt.name}" from="${listPromptValues[prompt.name]*.values().collect()}" name="prompt" value="" noSelection="['':'']"/> 
        <br>        
       </g:if> 
      </g:each> 
     </li> 
    </g:if> 
</ol> 

然后在run.js

function runReport(reportIn){ 
    var promptChain = $("#prompt :select[name=prompt]").serialize(); 
    reportName = reportIn; 
    ... 
} 

我要对这个错误?

编辑2:拼抢提示像它应该

... 
<g:if test="${prompt.datatype.type == 'DropDown'}"> 
    <g:select id="${prompt.name}" from="${listPromptValues[prompt.name]*.values().collect()}" name="${prompt.name }" value="" noSelection="['':'']"/> 
    <br>        
</g:if> 
... 

和jQuery的

var promptChain = jQuery('select').serialize(); 

回答

1

你使用jQuery,所以只序列化形式的选择要素。无所谓他们有多少。无需跟踪一些全局变量。

function runReport(reportIn) { 
    var promptChain = $("select[name=prompt]").serialize(); 
    .... 
} 

这里有一个jsFiddle

+0

的选择是不是一种形式,它只是在一个有序列表中列出?或者更容易将它们包装在表单标签中? – idonaldson

+0

好的,请将#myForm替换为UL的ID? – Gregg

+0

当我添加它时,我在Chrome中的开发者控制台中收到了“Uncausght TypeError:无法调用方法'序列化null'”。 – idonaldson