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

How to compare hash map key dynamically inside the closure in Grails?

这里我有从控制器传递到 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");
    <% } %>
<% } %>

GSP 中的变量声明

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

<% patientIdentifier = 'randomName' %>

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

检查命名文件中是否包含 Patient

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

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

假设你有:

  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>

这个 returns {id:1, Name:Fred} 在 gsp 上是列表迭代

我的天哪,如果你在控制器中,我理解你为什么必须这样做,但这不是一个好习惯,你可以创建一个 tagLib 来获取当前值并处理根据给定列表中的某些内容输入,或者可能针对 db fresh on the fly 所有正确呈现的内容。

最终编辑,同时你可以声明像 jsp 这样的变量,你也可以使用

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

默认情况下为页面设置了变量,但可以通过任何一种方式将其制成会话变量,它比 <% %>

干净得多

希望最终编辑

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

如果我理解正确的话,您在控制器中发生了某些事情,就像正在生成的某些列表中一样。缺少的部分必须是你正在做某种形式的形式检查可能是一个 select 框 selection 然后最终在 jquery 中你的意思是你有某种形式的 java 针对表单字段检查进行的脚本检查。

有两种方法可以将此类信息输入 java 脚本世界以实现此类目的

方法一:

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

方法二 控制器

 //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']

老实说,我不明白你在问什么,结果你遇到了什么样的问题,但我猜你试图实现类似的东西:

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

正如您可能注意到的那样,我试图避免 scriptlet 混乱并使用 grails 自定义标签。

另外,我很难想象您将如何调用 jQuery 函数来获取变量,然后使用它在服务器端生成视图。但是首先尝试定义一些模拟 "patient" 变量来测试我的样本。

如果 "patient" 变量值仅在客户端可用 - 因此您必须更改方法并生成不在服务器上的警报。

更新 另一方面,你可以在你的控制器中 return 你的 nameFiles 作为 JSON 然后在客户端用 javascript 解析这个 JSON 像这样:

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

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

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