如何在Grails中动态地比较Hash Map键



在这里,我有从控制器到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功能获得随机患者,在neverfiles key

中可能不可用
//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");
    <% } %>
<% } %>

假设您有:

  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,该taglib获得当前价值并根据条目处理条目到给定列表中的某些东西,或者可能是针对DB Fresh All the Fresh All Profformed Proded Proded的。

最终编辑,而您可以声明变量(例如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']

老实说,我没有得到你在问什么以及结果有什么样的问题,但我想您试图实施类似的东西:

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

您可能会注意到,我试图避免scriptlet弄乱并使用了grails自定义标签。

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

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

upd另一方面,您可以在控制器中返回您的名字作为JSON,然后在客户端与JavaScript解析此JSON:

var nameFiles = JSON.parse("${nameFiles}")
if (nameFiles.hasOwnProperty(patient)) {
    alert("Yes nameFiles contain the patient");
}

我没有测试此代码,但是至少您指出了GSP在服务器上渲染,并且可以将地图转换为JSON,将其传递给视图,用JavaScript解析并生成所需的警报。

gsp

中的变量声明

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

<% patientIdentifier = 'randomName' %>

有关更多详细信息,请参见有关变量和范围的Grails文档。

检查患者是否包含在名为Files

您无需在地图上迭代。只需检查地图是否包含密钥。

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

相关内容

  • 没有找到相关文章

最新更新