JSF проблематичный выбор строки - PullRequest
1 голос
/ 26 января 2011

У меня проблема с выбором строк в Primefaces Datatable.Я использую динамические столбцы, поэтому стандартный механизм выбора строк здесь не используется, я сам реализую выбор флажков.

Чтобы помочь, вот упрощенная версия того, что у меня есть в моем xhtml:

<h:form>
  <p:dataTable id="table"
               var="result"
               value="#{tableBean.results}">

    <p:columns value="#{tableBean.columnNames}" var="column" columnIndexVar="colIndex">
      <f:facet name="header">
        #{column}
      </f:facet>

      <h:panelGroup rendered="#{colIndex==0}">
        <h:outputLabel>#{rowIndex}</h:outputLabel>
        <h:selectBooleanCheckbox value="#{tableBean.selectedRows[result[0]]}"/>
      </h:panelGroup>
    </p:columns>
  </p:dataTable>
  <h:commandButton value="Submit"></h:commandButton>
</h:form>

И вот что у меня есть в управляемом компоненте для установки флажков:

package testpackage;

import java.util.*;
import javax.faces.bean.*;

@ManagedBean
@SessionScoped
public class TableBean
{

  private Map<String, Boolean> selectedRows = new HashMap<String, Boolean>();
  List<List<String>> results = new LinkedList<List<String>>();

  public TableBean()
  {
    List<String> row1 = new LinkedList<String>();
    List<String> row2 = new LinkedList<String>();
    row1.add("row1.ref");
    row1.add("row1.id");
    row1.add("row1.status");
    row2.add("row2.ref");
    row2.add("row2.id");
    row2.add("row2.status");
    results.add(row1);
    results.add(row2);

    //selectedRows.put("row2.ref", true);
  }

  public Map<String, Boolean> getSelectedRows()
  {
    return selectedRows;
  }

  public String submit()
  {
    List<List<String>> selectedResults = new ArrayList<List<String>>();
    for (List<String> result : results)
    {
      if (selectedRows.get(result.get(0)) != null)
      {
        selectedResults.add(result);
        selectedRows.remove(result.get(0));
      }
    }

    return null;
  }

  public List<List<String>> getResults()
  {
    return results;
  }

  public List<String> getColumnNames()
  {
    List<String> columnNames = new LinkedList<String>();
    columnNames.add("");
    columnNames.add("REF");
    columnNames.add("ID");
    columnNames.add("STATUS");
    return columnNames;
  }
}

Метод getSelectedRows прекрасно работает, но проблема в том, что метод setSelectedRows никогда не вызывается, поэтому я не знаю, какиефлажки, выбранные пользователем.Может быть, я упускаю из виду что-то очень тривиальное, но не могу найти решение.

Есть идеи по этому поводу?Я был бы очень рад, если бы вы помогли или дали какое-либо другое решение для выбора строк для динамических столбцов.

Заранее спасибо, Леви

Ответы [ 2 ]

1 голос
/ 26 января 2011

Сеттер никогда не вызывается для вложенных объектов. Вы - тот, кто отвечает за их создание, а не JSF. JSF просто получает вложенный объект и затем вызывает для него установщик (который является методом put() в случае Map). Вам просто нужно определить выбранные строки в методе действия. Добавьте метод действия к кнопке команды:

<h:commandButton value="Submit" action="#{bean.submit}"></h:commandButton>

, который определяется следующим образом (предполагая / предполагая, что var="result" по сути является Object[]):

public String submit() {
    List<Object[]> selectedResults = new ArrayList<Object[]>();
    for (Object[] result : results) {
        if (selectedRows.get((String) result[0])) {
            selectedResults.add(result);
            selectedRows.remove(result[0]); // Reset.
        }
    }

    // Now selectedResults contains all selected results.
}
1 голос
/ 26 января 2011

Мне кажется, вы отображаете неправильное поле в selectBooleanCheckBox.
Вы должны использовать переменную или поле из переменной result.
Мое решение:
В вашей ситуации вы визуализируете объект из List как форму строки таблицы, поэтому, если вы хотите внести некоторые изменения и получить статус этой строки, вам следует использовать переменную только из этого объекта.

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

Надеюсь, это поможет.

...