Grails动态广播组

时间:2014-04-09 21:20:12

标签: grails radio-group

我要求grails应用程序在屏幕上显示问题列表,每个问题下面列出了6个等级选项。这些问题和成绩的信息来自数据库中的查找表。我有问题和成绩显示在屏幕上,但我不知道如何获取查找信息以保存在数据库中。我还想知道是否有办法在每个问题上默认选择某个等级。我尝试了checked =“S”,但这只选择最低级问题的S等级。

我的视图代码是

  <label for="questions"></label>
    <ul class="one-to-many">
    <!-- Evaluation Questions -->
    <g:each in="${cdeEvaluationInstance?.questions}" var="evalQuestion" status="i">
    <g:hiddenField name="cdeEvaluation.questions[${i}].id" value="${evalQuestion.id}"/>
    <legend>
    ${evalQuestion.areaOfEval.title}
    </legend>
    <p>
    <strong>Focus areas: ${evalQuestion.areaOfEval.focusArea}</strong>
    </p>
    <p>
    <em> ${evalQuestion.areaOfEval.description}
    </em>
    </p>
    <p>
    <g:each in="${evalQuestion.areaOfEval.grades.sort{it.grade}}"
    var="grade" ><div class="radio">
    <span class="clear long"> 
    <input type="radio"
    name="radioGroup" value="${evalQuestion.grade}" checked="S"  /> 
    <label class="long"><strong> ${grade.grade}
    </strong> ${grade.description}</label>
    </div>
    </g:each>

我的控制器代码是

def evalQuestions = EvaluationService.fetchActiveEvaluationQuestions();
            //def evaluation = new CdeEvaluation(questions: evalQuestions)

           def evaluation = new CdeEvaluation(params)
           evaluation.setQuestions(evalQuestions)

表格中的问题和答案

package gov.mt.mdt.cde.domain.evaluation

import java.util.Date;

class CdeEvalQuestion extends Base{

    CdeAreaOfEvaluation areaOfEval
    CdeAreaOfEvalCriteria grade

    String comments

    static belongsTo = [cdeEvaluation: CdeEvaluation]




    static mapping = {
        id column: 'cevqu_id_seq'
        id generator: 'sequence', params: [sequence: 'cevqu_id_seq']

        areaOfEval column: 'caoe_id_seq'
        grade column: 'caoec_id_seq'
    }

    static constraints = {
        comments(blank:true, nullable:true, maxSize:2000)

        createdBy(blank: false, nullable:false, maxSize:13)
        dateCreated(blank: false, nullable:false)
        lastUpdatedBy(blank: false, nullable:true, maxSize:13)
        lastUpdated(blank: false, nullable:true)
    }
}

我刚刚开始学习grails / groovy,所以你可以指出我的任何帮助或例子都会很棒。谢谢!

1 个答案:

答案 0 :(得分:1)

因此,默认情况下选择一个特定的问题,您可以执行以下操作:

<g:radioGroup name="myGroup" labels="evalQuestion.areaOfEval.grades" values="evalQuestion.areaOfEval.grades*.grade" value="evalQuestion.grade">
    ${it.radio} <label class="long"><strong>${it.label.grade}</strong> ${it.label.description}</label>
</g:radioGroup>

这不需要你写每个内部。基本上你传递一组标签和一个并行的值数组。 value属性是values属性的默认值。对于每个标签和值对,将重复radioGroup的内部主体。 *。 (aka spread operator)与使用collect()方法基本相同。

我删除了标签的扩展运算符,并将完整的对象传递给标签。然后当我执行it.label时,我会在标记的正文内部使用完整的对象,并且可以使用不同的字段it.label.descriptionit.label.grade

至于将默认值设置为等级S.您需要编写代码以从evalQuestion.areaOfEval.grades中找到等级S.类似的东西:

evalQuestion.areaOfEval.grades.find { it.grade == 'S' }

并将其传递给标签的value属性。你可以这样做:

<g:set var="defaultGrade" value="evalQuestion.areaOfEval.grades.find { it.grade == 'S' }"/>

<g:radioGroup name="myGroup" 
              labels="evalQuestion.areaOfEval.grades" 
              values="evalQuestion.areaOfEval.grades*.grade" 
              value="defaultGrade">