0

深さが無制限の複雑なフォームオブジェクトがあり、スプリングフォームタグを使用してjspで編集しようとしています。

メインのmodelAttributeはスプリングフォームにバインドされており、子を反復処理している間、nestedPathを使用し、everithingは問題なく機能します。その結果、次のような入力名を生成しました。

name="elements['secondColumn'][0].elements[0].removed"

問題は、生成された名前がわからないことです。なぜ私はそれが必要ですか?適切なフィールド「削除済み」を1に設定する削除ボタンがあるとします。

更新: どのように機能しますか?再帰的に自分自身と呼んでいるタグファイルを使用しています。

container.tag

<c:forEach items="${elements}" var="element" varStatus="index">
 <spring:nestedPath path="elements[${index.count - 1}]">
   <my:elementConfig element="${element}">
    <my:container elements="${element.elements}"/>
   </my:elementConfig>
 </spring:nestedPath>
</c:forEach>

elementConfig.tag

...
<form:hidden path="removed"/>
...
<button onclick="delete('howToGetNameOfRemovedHidden')">Delete</button>
...
<jsp:doBody/>
...

私がすでに見つけた最も近い一致は「nestedPath」pageContext属性ですが、modelAttribute(フォーム)名の名前も含まれています。

生成された名前を取得する公式の方法はありますか?

ありがとう

4

2 に答える 2

0

たとえば、HTML5の属性を使用して、追加の属性を調べることができると思いますdata-*

<c:set var="i" value="0" />
<c:foreach [...]>
    <form:input path="[...].remove" data-inputid="input${i}" />
    <button class="removebutton" data-inputid="input${i}">Remove</button>
    <c:set var="i" value="${i + 1}" />
</c:foreach>

次に、たとえばjQueryを使用します。

$(function() {
    $(".removebutton").click(function() {
        var dataInputId = $(this).data("inputid");
        $("input[data-inputid='" + dataInputId + "']").val(1);
    });
});

ただし、忘れないでください。ネストされたループがある場合は、data-inputドキュメント全体で一意である必要があります。

于 2012-11-27T14:13:20.770 に答える
0

生成された入力名を取得するための公式のサポートがないように思われるので、それを処理する関数を作成しました。これは、Springフォームタグライブラリで見つけた機能に基づいています。

静的メソッド:

public class JspUtils {

    public static String escapeJS( String value) {
        return StringEscapeUtils.escapeJavaScript( value);
    }

    public static String getPath( PageContext pageContext, String name) {

        String path =   (String)pageContext.getRequest().getAttribute( "nestedPath");
        if (path == null)
            path    =   (String)pageContext.getAttribute( "nestedPath");
        if (path == null)
            return name;

        path        =   path.substring( path.indexOf( ".") + 1);
        path        +=  name;
        return path;
    }

    public static String getPathJsEscaped( PageContext pageContext, String name) {
        return StringEscapeUtils.escapeJavaScript( getPath(pageContext, name));
    }
}

tldの定義:

<function>
    <description>
        Get nested path value as string
    </description>
    <name>getPath</name>
    <function-class>com.pathfix.JspUtils</function-class>
    <function-signature>java.lang.String getPath(javax.servlet.jsp.PageContext, java.lang.String)</function-signature>
</function>
<function>
    <description>
        Get nested path value as javascript escaped string
    </description>
    <name>getPathJsEscaped</name>
    <function-class>com.pathfix.JspUtils</function-class>
    <function-signature>java.lang.String getPathJsEscaped(javax.servlet.jsp.PageContext, java.lang.String)</function-signature>
</function>

使用例:

<%@ taglib prefix="pathfix" uri="http://pathfix.com"%>

Name: <form:input path="name"/>
<a href="javascript: alert('Generated name is ${pathfix:getPathJsEscaped( pageContext, 'name')}')">Test it!</a>
于 2013-02-05T09:32:41.493 に答える