Грааль: <g: выберите - PullRequest
       11

Грааль: <g: выберите

4 голосов
/ 25 марта 2010

Как мне добиться следующего:

В моем Домене хранится логическое значение, по умолчанию Grails создает флажок в качестве элемента управления. Я хочу выбрать элемент управления со значениями: активный / неактивный. При выборе Active значение True должно быть передано а также При выборе InActive необходимо передать значение False.

Как мне добиться этого, используя

<g:select name="status" from="" optionKey="" value=""  />

Очень ценится.

Ответы [ 2 ]

8 голосов
/ 25 марта 2010

Я не знаю, является ли это лучшим подходом, но у вас может быть перечисление, чтобы сделать работу:

public enum SelectOptions{
    ACTIVE(true, 'Active'),
    INACTIVE(false, 'InActive')

    Boolean optionValue
    String name

    SelectOptions(boolean optionValue, String name){
        this.optionValue = optionValue
        this.name = name
    }

    static getByName(String name){
        for(SelectOptions so : SelectOptions.values()){
            if(so.name.equals(name)){
                return so;
            }
        }
        return null;
    }

    static list(){
        [ACTIVE, INACTIVE]
    }

    public String toString(){
        return name
    }
}

Добавьте экземпляр перечисления SelectOptions в свой домен:

class MyDomain {
    SelectOptions selectOptions = SelectOptions.ACTIVE
    //Other properties go here

    static constraints = {
        selectOptions(inList:SelectOptions.list())
        //other constraints
    }
}

Тогда в вашем представлении GSP:

<g:select
    name="status"
    from="${myDomainInstance.constraints.selectOptions.inList}"
    value="${myDomainInstance.selectOptions}" />

В методе сохранения вашего контроллера вам нужно получить правильное перечисление из значения String, представленного представлением:

def save = {
    SelectOptions selectOption = SelectOptions.getByName(params.status)
    def myDomainInstance = new MyDomain(params)
    myDomainInstance.selectOptions = selectOption
    // proceed to save your domain instance
}
0 голосов
/ 08 марта 2014

Хорошо. После долгих мозговых штурмов я смог понять это.

Мой код проще и выглядит так:

package exproj.masters

 public enum ExamDurationTypes{
    FULL_EXAM(1, 'For Whole Exam'),
    PER_QUESTION(2, 'Per Question')

    Integer optionValue
    String name

    ExamDurationTypes(Integer optionValue, String name){
        this.optionValue = optionValue
        this.name = name
    }

    static getByName(String name){
        for(ExamDurationTypes edt : ExamDurationTypes.values()){
            if(edt.name.equals(name)){
                return edt;
            }
        }
        return null;
    }
    static list(){
        [FULL_EXAM, PER_QUESTION]
    }

    public String toString(){
        return optionValue
    }

}

Затем я добавил его в свой класс домена

class Exam {
.
.
.

Integer durationType

    static constraints = {
        durationType(inList: ExamDurationTypes.list())
    }   

}

На своей странице GSP я взломал это так

<g:select
name="durationType"
from="${exproj.masters.ExamDurationTypes.values()*.getName()}"
keys="${exproj.masters.ExamDurationTypes.values()*.getOptionValue()}"
value="${examInstance.durationType}" />

Наконец выдает это:

<select name="durationType" id="durationType">
<option value="1">For Whole Exam</option>
<option value="2">Per Question</option>
</select>

Наслаждайтесь кодированием

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...