如何在 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= 解析] 并生成所需的警报。
这里我有从控制器传递到 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= 解析] 并生成所需的警报。