如何在Grails中的闭包内动态比较哈希映射键?

时间:2017-02-18 18:24:06

标签: java grails gsp

这里我有从控制器传递到GSP页面的哈希映射。

控制器:

Map<String, List<String>> nameFiles = new HashMap<String, List<String>>();

  nameFiles.put('patient1',["AA","BB","CC"]);
  nameFiles.put('patient2',["DD","EE","FF"]);

model.put("nameFiles", nameFiles);

GSP页面:

var patient = getPatient(); //假设我们通过一些jQuery函数得到随机患者,可能在nameFiles键中无法使用

//check If nameFiles contain key same as patient varaible 
 <% nameFiles.each { fm -> %>
    <% if (fm.containsKey(patient)) { %> // This if statement cannot compare dynamic sting varaaible. How to do this.
        alert("Yes nameFiles contain the patient");
    <% } %>
<% } %>

3 个答案:

答案 0 :(得分:0)

GSP中的变量声明

您可以在<% %>括号内声明变量:

<% patientIdentifier = 'randomName' %>

有关详细信息,请参阅Variables and Scopes上的Grails文档。

检查患者是否包含在namedFiles中

您不需要遍历地图。只需检查地图是否包含密钥。

// check if nameFiles contains key same as patient variable
<% if (nameFiles.containsKey(patient)) { %>
    alert("Yes nameFiles contains the patient");
<% } %>

答案 1 :(得分:0)

假设你有:

  Map<String, List<String>> nameFiles = new HashMap<String, List<String>>();
            nameFiles.put('patient1',[id:1,name:'Fred'])
            nameFiles.put('patient2',[id:2,name:'Tom'])

获得当前患者就这么简单:

    <% def aa = nameFiles?.find{it.key=='patient1'}?.value %>
      <g:if test="${aa}">
        //  we definitely have ${aa} and it has been made null safe 
      <g:if>

这将在gsp上返回{id:1, Name:Fred},这是列表迭代

我的善良所有其他如果它就像你在控制器中,我理解为什么你必须这样做但是你不仅可以创建一个带有当前值并根据条目处理条目的tagLib对于某个给定列表中的某些内容,或者可能是正确呈现的所有正确生成的数据库。

最后编辑虽然您可以声明变量,如jsp,您也可以使用

<g:set var="aa" value="${nameFiles?.find{it.key=='patient1'}?.value}" scope="page|session|..."/>

默认情况下,为页面设置了变量,但可以将其设置为会话变量,这种方式比<% %>

更清晰

希望最终修改

我认为人们应该仔细考虑他们的实际问题,并尝试清楚地表达问题,否则由于帖子质量差,观众最终会回答其他问题。

如果我理解正确,你会在控制器中发生某些事情,就像正在生成一些列表一样。缺少的一点必须是你正在做某种形式的表格检查可能是一个选择框选择,然后在jquery结束,你的意思是你有一些形式的java脚本检查正在进行表格字段检查。

为了这样的目的,有两种方法将这些信息泵入javascript世界

方法1:

//I haven't tested this, hopefully gives you the idea
var array = []
<g:each in="${namedFiles}" var="${pa}">
    array.push({code:'${pa.key} listing:'${pa.value}'})
</g:each>

方法2 控制器

 //where you now push named files as a json  
  return [namedFiles as JSON].toString()

  // or alternatively in gsp javascript segment something like this
  var results=$.parseJSON('<%=namedFiles.encodeAsJSON()%>');
  var results = results['patient1']

答案 2 :(得分:0)

老实说,我没有得到你问的是什么,你有什么样的问题,但我想你试图实现这样的事情:

<g:if test="${nameFiles[patient]}">
    alert("Yes nameFiles contain the patient");
</g:if>

您可能会注意到我试图避免脚本混乱并使用grails自定义标记。

此外,我很难想象你将如何调用jQuery函数来获取变量,然后使用它来生成服务器端的视图。但试着定义一些模拟&#34;患者&#34;首先变量来测试我的样本。

如果&#34;患者&#34;变量值仅在客户端可用 - 因此您必须更改方法并在服务器上生成警报。

UPD 另一方面,您可以在控制器中将nameFiles作为JSON返回,然后在客户端使用javascript解析此JSON,如下所示:

var nameFiles = JSON.parse("${nameFiles}")

if (nameFiles.hasOwnProperty(patient)) {
    alert("Yes nameFiles contain the patient");
}

我还没有测试过这段代码,但至少你指出gsp是在服务器上呈现的,你可以将地图转换为JSON,将其传递给视图,用JavaScript解析并生成所需的警报。 / p>