Итератор struts2: избежание дублирования кода - PullRequest
0 голосов
/ 15 марта 2011

Я создаю форму, в которой пользователю необходимо динамически добавлять элементы формы. addEmptyItem () выполняет это путем клонирования первого элемента в данном списке, очистки его значений, обновления его индексов и добавления его.

Конечно, требуется, чтобы в списке был хотя бы один элемент списка. Мое решение состоит в том, чтобы всегда отображать первый элемент списка, а затем перебирать остальные. Это беспокоит меня из-за дублирования кода. Хуже, когда элементы списка содержат много полей.

То, что я хочу, - это что-то похожее на цикл do-while. Любые предложения, как решить эту проблему без дублирования кода, как я делаю сейчас:

<s:submit type="button" onclick="addEmptyItem($('#owners')); return false;"
          value="%{getText('ownership.addOwner')}"/>

<ul id="owners">
  <li>
    <s:textfield name="ownership.owner[0].name"
                 label="%{getText('ownership.owner.name')}"/>
    <s:textfield name="ownership.owner[0].share"
                 label="%{getText('ownership.owner.share')}"/>
  </li>

  <s:iterator value="ownership.owner" status="i" begin="1">
    <li>
      <s:textfield name="ownership.owner[%{#i.count}].name"
                   label="%{getText('ownership.owner.name')}"/>
      <s:textfield name="ownership.owner[%{#i.count}].share"
                   label="%{getText('ownership.owner.share')}"/>
  </li>
  </s:iterator>
</ul>

1 Ответ

1 голос
/ 15 марта 2011

Вы можете попробовать переместить код с полями в новый файл страницы и включить его следующим образом:

<ul id="owners">
  <li>
   <s:include value="fileds.jsp">
      <s:param name="index" value="0" />
   </s:include>
  </li>

  <s:iterator value="ownership.owner" status="i" begin="1">
    <li>
      <s:include value="fileds.jsp">
        <s:param name="index" value="%{#i.count}" />
      </s:include>
  </li>
  </s:iterator>
</ul>

и используйте index param во включенном файле.

...