2013-02-12 39 views
2

說我有一個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和分裂表格。

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

回答

4

<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