如何有条件地禁用表单输入字段

时间:2013-02-12 20:34:04

标签: grails grails-2.0

假设我有一个域对象教师,其中包含两个字段字符串名称,TeacherType teacherType,其中TeacherType是包含AssitantProfessor的枚举,AssociateProfessor,教授。

在使用grails run-target generate-all Teacher生成视图后,它会生成一个_form.gsp,用于创建和编辑Teacher。在编辑视图中,我只希望名称可以编辑,但是一旦创建了TeacherType就不可修改(这只是一个例子,要求某些字段在创建后无法更新)。在创建视图中,TeacherType和name都应该是可编辑的。

由于create.gsp和edit.gsp都呈现_form模板,这里的首选方法是什么?

  1. 创建两个单独的模板,即_formCreate.gsp,_ formEdit.gsp;或
  2. 传入create.gsp和edit.gsp中的模型映射,并在_form.gsp中使用它们来有条件地渲染视图? e.g。
  3. 在create.gsp中:

        <fieldset class="form">
            <g:render template="form" model="[teacherInstance: teacherInstance, 'mode':'create']"/>
        </fieldset>
    

    在edit.gsp

        <fieldset class="form">
            <g:render template="form" model="[teacherInstance: teacherInstance, 'mode':'edit']"/>
        </fieldset>
    

    在_form.gsp

        <g:if test="${mode == 'edit'}">
            <g:select name="teacherType" from="${TeacherType?.values()}" keys="${TeacherType.values()*.name()}" required="" value="${teacherInstance?.teacherType?.name()}" disabled="disabled"/>
        </g:if>
        <g:else>
            <g:select name="teacherType" from="${TeacherType?.values()}" keys="${TeacherType.values()*.name()}" required="" value="${teacherInstance?.teacherType?.name()}" disabled="false"/>
        </g:else>
    

    方法2有效,但我想如果条件语句的数量增加,那么按照方法1并拆分表格可能会更好。

    还有其他方法我不知道吗?

1 个答案:

答案 0 :(得分:4)

disabled(以及许多其他<g:select>表单字段标记)的<g:...>属性可以是布尔值表达式:

<g:select name="teacherType" from="${TeacherType?.values()}"
  keys="${TeacherType.values()*.name()}" required=""
  value="${teacherInstance?.teacherType?.name()}"
  disabled="${mode == 'edit'}"/>

如果表达式的计算结果为true,则表示为disabled="disabled",如果表达式为false,则表示缺少disabled属性(即不禁用该字段)。您甚至可以在模型中使用布尔条目,例如使用

渲染模板
model="[teacherInstance: teacherInstance, editing:true]"

(或分别为editing:false),然后在disabled="${editing}"上说<g:select>