2010-12-28 2 views
0

私はgrailsに新しいビーです。私は次の質問をしています。Controller内のInstanceList全体をバインド/更新する方法は?

問題ドメイン:

  • 親ドメインクラスブール 過渡特性を持つ "はisValid"。

  • 子ドメインには、ブール値のプロパティ "isValid"があります。

  • 親/ list.gspユーザーが私 は、さらに、各親 子供のプロパティを設定するために使用することができますParentControllerで更新 機能、上、ParentInstanceListに親インスタンス の IsValidプロパティを変更できるようにする「のisValid」。

親ドメインクラス

class Parent { 

String name 
boolean isValid = false 

static hasMany = [children:Child] 
static transients =['isValid'] 

} 

子ドメインクラス

class Child { 

String name 
boolean isValid 
Parent parent 

static belongsTo = [parent:Parent] 

} 

親/ list.gsp

<g:form method="post" action="update" > 
    <div class="list"> 
     <table> 
      <thead> 
       <tr> 

        <g:sortableColumn property="id" title="${message(code: 'parent.id.label', default: 'Id')}" /> 

        <g:sortableColumn property="name" title="${message(code: 'parent.name.label', default: 'Name')}" /> 
        <g:sortableColumn property="isValid" title="${message(code: 'parent.isvalid.label', default: 'isValid?')}" /> 

       </tr> 
      </thead> 
      <tbody> 
      <g:hiddenField name="parentInstanceList" value="${parentInstanceList }"/> 
      <g:each in="${parentInstanceList}" status="i" var="parentInstance"> 

       <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 

        <td><g:link action="show" id="${parentInstance.id}">${fieldValue(bean: parentInstance, field: "id")}</g:link></td> 

        <td>${fieldValue(bean: parentInstance, field: "name")}</td> 
        <td> 
        <g:checkBox name="isValid" value="${parentInstance?.isValid }"/> 
        </td> 

       </tr> 
      </g:each> 
      </tbody> 
     </table> 
    </div> 
    <div class="paginateButtons"> 
     <g:paginate total="${parentInstanceTotal}" /> 
    </div> 

    <div class="buttons"> 
     <span class="button"> 
      <g:actionSubmit class="update" action="update" value="${message(code: 'default.button.update.label', default: 'update')}" /> 
     </span> 
    </div> 

親/ list.gspのスナップショット:http://img156.imageshack.us/i/parentlistview.png/

問合せ:私は/ parentInstanceのプロパティ「のisValid」にチェックされていない、私は簡単に親の子プロパティを設定することができ未確認追跡することができますどのように 「のisValid "

def parentInstanceList = params.parentInstanceList 
    parentInstanceList.each { 
     Parent parent = it 
     parent.children.each{ 
      Child child = it 
      child.isValid=parent.isValid 
     } 
    } 

は、これまでのところ私はparams.parentInstanceList以上のすべての親のIDを取得することですが、私は、私は、各parentInstanceの変更されたプロパティをバインドすることができますどのようにそれを把握することはできません。 単一parentInstanceがある場合は、1つは簡単に事前に

Parent parentInstance = Parent.get(params.id) 
parentInstance.properties = params 

おかげ

レーマン

答えて

0

それを行うことができ、私はそれぞれの行のために特別に名前のチェックボックスにレンダリングすることを好む:

<g:checkBox 
     name="Parent_${parentInstance.id}" 
     value="${parentInstance.isValid ? 'on' : 'off'}" /> 

を入力し、チェックボックスをすべてオンにします。

def update = { 
    Collection<Parent> checked = params.collect{ Map.Entry that -> 
     that.value != "on" ? null : getParentForCheckbox(that.key) 
    }.findAll{ it != null } 

    ... // and then assign 'isValid' by hand 
} 

あなたは、それは、parentInstanceList[0]などのチェックボックスに名前を付け、その後、parentInstanceListプロパティを使用して、いくつかのオブジェクトにproperties = paramsを割り当てることを、アレイのプロパティを使用することができますが、それはエラーが発生しやすいです:あなたがHTMLでレンダリングparentInstanceListが同じであることを保証はありませんあなたがプロパティを割り当てるように。