1

私はいくつかの古いコードを見ていて、選択されている連絡先インスタンス ID (チェックボックス) を、リモート フィールドが入力されるレポートを選択するボックスに添付するという目標を達成しようとしています。たとえば、これはコントローラーに渡されるパラメーターです。

[id:1, reportsToResults:[x, y, z, ], reportsTo.id:[56, 55, 55], reportsTo:[id:[56, 55, 55]], contactList:[55, 57], _contactList:[, , , ], _select:, action:index, controller:tempController]

私が理論的に必要としているのは、次のようなものです。

contactList:[ , , 55, 57, ] (where empty spaces are checkboxes that are NOT selected.    
reportsTo.id:[ , , 56, 56, ] (where empty spaces are empty selection boxes.

値の配列を渡すにはどうすればよいですか? すべての contactList ID と reportsTo.id を渡すことはできますが、配列スロットに基づいて正しく一致させたり、それらを結び付けたりすることはできません。

何か案が:?

<!doctype html>
<html>
    <head>
        <meta name="layout" content="main">
    </head>
    <body>
        <div id="company-roster" class="company-roster">
        <h1>${companyName} Roster</h1>
            <g:form>
                <g:hiddenField name="id" value="${id}" />
                <div class="choicePanel">
                    <div class="choicePanel-reportsTo">
                        <label>Save all reports to additions:</label>
                        <g:actionSubmit value="Update Reports To" action="addReportsTo"/>
                    </div>
                </div>
                <script>
                    function all() {
                        $(':checkbox[name=select]').click (function () {
                          $(':checkbox[name=contactList]').prop('checked', this.checked);
                        });            
                    }
                </script>
                <div style="position:absolute; margin-top:10px; width: 1350px; height: 650px; overflow: auto;">
                <table>
                    <thead>
                        <tr>
                            <th><g:checkBox name="select" onclick="all();"/></th>
                            <g:sortableColumn property="firstName" action="roster" title="${message(code: 'contact.firstName.label', default: 'First Name')}" />
                            <g:sortableColumn property="lastName" action="roster" title="${message(code: 'contact.lastName.label', default: 'Last Name')}" />
                            <th>Reports To</th>
                        </tr>
                    </thead>
                    <tbody>
                        <g:each in="${companyRoster}" status="i" var="contactInstance">
                                <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">

                                <td><g:checkBox name="contactList" value="${contactInstance.id}" checked="${false}"/></td>
                                <td>${fieldValue(bean: contactInstance, field: "firstName")}</td>
                                <td>${fieldValue(bean: contactInstance, field: "lastName")}</td>
                                <td>
                                    Reports To: <g:remoteField action="getReportsToResults" controller="contact" id="" update="rtResult_${contactInstance.id}" paramName="search" name="reportsToResults" value="" />
                                    <br/>
                                    <g:each in ="${contactInstance?.reportsTo}" var="reportsTo" status="x">
                                        <li style="list-style-type:none;">${reportsTo}<g:link controller="contact" action="removeReportsTo" params="${[reportsToID: reportsTo.id, contactInstanceID: contactInstance.id, comp_id:id]}">Remove</g:link></li>
                                    </g:each>
                                </td>
                                <td>
                                    <div id="rtResult_${contactInstance.id}" class="rtResult_${contactInstance.id}">
                                        <g:select name="reportsTo.id" from="${rtResults}" value="" />
                                    </div>
                                </td>
                                </tr>
                        </g:each>
                    </tbody>
                </table>
                </div>
            </g:form>
        </div>
    </body>
</html>
4

1 に答える 1

3

私は通常、フォームの各チェックボックスに一意で識別可能な名前と、それが参照する対応する ID を付けることによってこれを行いますhiddenField...

<g:checkBox name="contact.${i}.checkBox" checked="${false}"/>
<g:hiddenField name="contact.${i}.id" value="${contactInstance.id}" />

上記では、ループiからの変数を使用しました。これにより、それぞれが順番に並んで一意になります。g:each

次に、項目の数を に格納する必要があります。g:formこれにより、コントローラー アクションが探すべき checkBox パラメーターの数を知ることができg:formます。

<g:hiddenField name="contactCount" value="${companyRoster.size()}" />

最後に、マップを反復params処理して、選択されているものと選択されていないものを処理できます。

def doStuff = {
    def contactCount = params.contactCount.toInteger();

    for( i in 0..contactCount){


        def contact = Contact.get(params.contact."${i}".id);

        if (params.contact."${i}".checkBox){ //<-- this will return 'on' or ''
            println("you selected: ${contact}");
        }else{
            println("you DID NOT select: ${contact}");
        }

    }
}

これに対処するにはいくつかの方法がありますが、上記の解決策は私が常に行ってきた方法です。コードの構文はテストされておらず、私の頭の中で考えただけですが、理解していただければ幸いです。楽しみ!

于 2012-06-05T17:46:35.350 に答える