2017-02-18 3 views
0

Здесь у меня есть хэш-карта, переданная с контроллера на страницу GSP.Как сравнить хэш карту ключевых динамически внутри закрытия в Grails?

Контроллер:

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"); 
    <% } %> 
<% } %> 
+1

Я не вижу никакого кода jQuery. «не работает» - не очень хорошее описание проблемы. Вы получаете ошибки или видите неправильный вывод? Пожалуйста, будьте более детальными. – 4castle

+0

У меня есть ключевой элемент, называемый randomName в Hashmap NameFiles, поэтому, когда <% if (fm.containsKey (patientIdentifier)) {%> alert ("YES"); Я должен предположить, что всплывающее сообщение YES, но я не вижу его – tenzin

+0

@ RenéScheibe: Я одобрил ваше редактирование, но ваша коррекция соответствия именования должным образом принадлежит вашему ответу. – pyon

ответ

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> 

Это возвращает {id:1, Name:Fred} на GSP, который представлен список итерация

Боже мой, что еще, если это так, как будто ты в контролере, я понимаю почему вы должны это делать, но это не очень хорошая практика, вы можете просто создать tagLib, который принимает текущее значение и обрабатывает запись в соответствии с чем-то в данном списке или, возможно, против свежего свежего на лету, все правильно представленное.

Final редактировать в то время как вы можете объявлять переменные как JSP вы также можете использовать

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

По переменной по умолчанию устанавливается на странице, но можно было бы сделать в переменной сеанса в любом случае это намного чище, чем <% %>

Надеюсь окончательное редактирование

Я думаю, что люди должны тщательно думать о том, что их реальная проблема, и пытаются представить проблему ясно дру в результате аудитория заканчивает ответ на что-то еще из-за низкого качества сообщения.

Если я правильно понял, у вас что-то происходит в контроллере, как в каком-то списке.Недопустимый бит должен быть вы, а затем выполняете какую-либо форму проверки формы, возможно, выбор блока выбора, который затем заканчивается в jquery тем, что вы имеете в виду, что у вас есть какая-то форма проверки скрипта java на проверку поля формы.

Есть два способа перекачки такой информации в яваскрипта мире для таких целей

Метод 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'] 
+0

спасибо за ответ, но в моем случае я получаю пациента от функции, а затем проверяю, находится ли этот пациент в имени. Я немного изменил свой вопрос, пожалуйста, дайте мне знать, если это станет более ясным. – tenzin

+1

Совсем не возник вопрос о картах, содержащих список строк с контроллера на gsp. Затем вы обновляетесь, чтобы поговорить о jquery и о ваших переговорах о переговорах grails gsp, в то время как вы перевернули его в jQuery. Результаты Jquery должны быть обработаны с использованием java-скрипта – Vahid

0

Объявление переменных в GSP

Вы можете объявлять переменные в <% %> скобках:

<% patientIdentifier = 'randomName' %> 

Для получения более подробной информации обратитесь к документации по Grails на Variables and Scopes.

Проверка пациент содержится в namedFiles

Вам не нужно перебирать карту. Просто проверьте карту, если она содержит ключ.

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

Я знаю, чтобы объявлять переменные с помощью скобок <% %>, но в моем случае я не могу этого сделать. – tenzin

+1

Затем, пожалуйста, предоставьте более подробную информацию в своем вопросе об этом. –

+0

Я добавил более подробную информацию, пожалуйста, дайте мне знать, если это станет более ясным. – tenzin

0

Честно говоря, я не сделал получить то, что вы спрашиваете, и какая проблема у вас есть в результате, но я предполагаю, что вы попытались реализовать что-то вроде этого:

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

Как вы, возможно, заметили, я попытался избежать беспорядка сценария и использовать специальные теги Grails.

Также я не представляю, как вы собираетесь вызвать функцию jQuery, чтобы получить переменную, а затем использовать ее для создания представления на стороне сервера. Но сначала попробуйте определить какую-то ложную «больную» переменную, чтобы проверить мой образец.

Если значение переменной «пациент» доступно только на стороне клиента - поэтому вам необходимо изменить подход и сгенерировать свои предупреждения не на сервере.

UPD С другой стороны, вы можете вернуть nameFiles в формате JSON в контроллере, а затем разобрать этот JSON с JavaScript на стороне клиента, как что:

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

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

Я не проверить этот код, но по крайней мере, вы указываете, что gsp отображаются на сервере, и вы можете преобразовать карту в JSON, передать ее в представление, проанализировать с помощью JavaScript и сгенерировать необходимое оповещение.

Смежные вопросы