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

问题描述:

说我有一个Domain对象Teacher具有两个字段String name,TeacherType teacherType,其中TeacherType是一个包含AssitantProfessor,AssociateProfessor,Professor的枚举。如何有条件地禁用表单输入字段

使用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中使用它们以有条件地呈现视图? 例如

在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> 

方法二的作品,但我想,如果数量条件语句增加它可能只是更好地遵循方法1和分裂表格。

是否有另一种我不知道的方法?

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

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

如果表达式评估为真这将呈现为disabled="disabled",和作为不存在的一个disabled属性(即该字段不会被禁用),如果表达式为false。您甚至可以在模型中使用布尔条目,例如渲染

model="[teacherInstance: teacherInstance, editing:true]" 

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

+0

很酷,我会试试看。它确实看起来更好,因为它消除了有条件的标签 – vsnyc 2013-02-13 05:40:57