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

vsn*_*nyc 3 grails grails-2.0

假设我有一个Domain对象Teacher,具有两个字段,字符串名称,TeacherType,TeacherType,其中TeacherType是一个包含AssitantProfessor,AssociateProfessor,Professor的枚举。

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

由于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>
Run Code Online (Sandbox Code Playgroud)

在edit.gsp中

    <fieldset class="form">
        <g:render template="form" model="[teacherInstance: teacherInstance, 'mode':'edit']"/>
    </fieldset>
Run Code Online (Sandbox Code Playgroud)

在_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>
Run Code Online (Sandbox Code Playgroud)

方法2可行,但我想如果条件语句的数量增加,则最好遵循方法1并拆分表格。

还有我不知道的另一种方法吗?

Ian*_*rts 5

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

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

如果表达式为假disabled="disabled",这将呈现为表达式的计算结果为true,以及缺少disabled属性(即不会禁用该字段)。您甚至可以在模型中使用布尔输入,例如使用

model="[teacherInstance: teacherInstance, editing:true]"
Run Code Online (Sandbox Code Playgroud)

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