Как получить значение идентификатора выбранного переключателя на странице gsp для класса контроллера/домена Grails

ИСПОЛЬЗОВАНИЕ: Grails 1.3.7 fyi.

<g:each var="name" in="${nameList}">
 <li>${name.first}</li>
 <input id="Add" type="radio" name="nameMod" value="${name.first}"/>Add
 <input id="Modify" type="radio" name="nameMod" value="${name.first}"/>Modify
 <g:hiddenField name="action" value="${nameMod.id} "/>
</g:each>

Вот что я пытаюсь сделать: я знаю, как получить значение переключателей, но мне также нужно знать, какая кнопка была нажата. Как вы можете видеть выше, я попытался установить идентификатор переключателя для действия (Добавить/Изменить), но я получаю сообщение об ошибке, указывающее, что .id не является допустимым свойством. Я знаю, как проверить, выбран ли переключатель или нет в jQuery, но я не уверен, как получить значение из jQuery в контроллер или класс домена.

Есть ли другой способ сделать это? В основном мне нужно знать действие и имя, чтобы я мог обновить базу данных.

Спасибо за любой совет! (Можно ли мне это говорить? Отредактируйте! ;))


person innov83r    schedule 20.07.2012    source источник
comment
Ошибка исходит от вашего hiddenField. Он пытается получить свойство id nameMod. Я думаю, вы можете захотеть value=${name.id} вместо этого.   -  person Weezle    schedule 21.07.2012


Ответы (5)


Вы могли бы сделать это с помощью jQuery, но это был бы хороший случай для использования объекта команды:

Вид:

<g:each var="name" in="${nameList}" status="i">
  <li>${name.first}</li>
  <input type="radio" name="nameAction[${i}]" value="add"/>Add
  <input type="radio" name="nameAction[${i}]" value="modify"/>Modify
  <g:hiddenField name="name[${i}]" value="${name.first} "/>
</g:each>

Объект команды:

class NameCommand {
    List<String> nameAction = []
    List<String> name = []
}

Контроллер:

def theAction = { NameCommand foo ->
    foo.nameAction.eachWithIndex { val, index ->
        if (val == "add") {
            whateverService.add(foo.name[index]) 
        }
        else {
            whateverService.modify(foo.name[index])
        }
    }
}
person Kevin Stricker    schedule 21.07.2012

добавьте некоторый класс (используемый только в javaScript) к вашему переключателю и используйте его!

<g:each var="name" in="${nameList}">
 <li>${name.first}</li>
 <input id="Add" type="radio" name="nameMod" class="f_radioButtonGroup" value="${name.first}"/>Add
 <input id="Modify" type="radio" name="nameMod" class="f_radioButtonGroup" value="${name.first}"/>Modify
 <g:hiddenField name="action" value="${nameMod.id} "/>
</g:each>

и в функции JavaScript

function getCheckedItemNumber() {
    var result;
    var radioButtons = $(".f_radioButtonGroup");
    for (var i = 0; i < radioButtons.length; i++) {
        if (radioButtons[i].checked) {
            result = radioButtons[i].value;
        }
    }
    return result
}
person Aram Arabyan    schedule 26.07.2012

Может быть, что-то вроде этого:

 <g:each var="name" in="${nameList}">
   <li>${name.first}</li>
  <input id="Add" type="radio" name="selectedAction" value="add"/>Add
  <input id="Modify" type="radio" name="selectedAction" value="modify"/>Modify
  <g:hiddenField name="nameMod" value="${name.first} "/>
 </g:each>
person Łukasz Dziedziul    schedule 20.07.2012

Вам, вероятно, придется сделать немного больше с именами переключателей, так как вы перебираете неизвестное количество имен. У вас может быть 100 радиокнопок в группе под названием nameMod — тогда вы можете выбрать только одну из этих 100 радиокнопок — что, я думаю, вам не нужно.

Когда у меня были такие вещи, я делал их так:

<g:each var="name" in="${nameList}">
  <li>${name.first}</li>
  <input type="radio" name="nameMod_${name.id}" value="add"/>Add
  <input type="radio" name="nameMod_${name.id}" value="modify"/>Modify
  <g:hiddenField name="name_${name.id}" value="${name.first} "/>
</g:each>

Это даст вам одну радиогруппу на имя и позволит вам получить к ним индивидуальный доступ в контроллере.

person Kelly    schedule 20.07.2012

Простой способ: просто объявите строку с именем selectedAction (должно совпадать с именем переключателя в gsp) в классе вашего домена. Вот и все, GORM позаботится о процессе привязки; значение выбранного переключателя будет помещено в selectedAction (поле класса домена).

Вам не нужно делать ничего, кроме этого. Вау!

person Rajesh Solo    schedule 04.05.2013