2012-12-20 2 views
3

Я пытаюсь создать страницу, на которой вы нажимаете кнопку, и она заполняет богатые datatable динамическим числом столбцов (в конечном итоге это будет поиск, но пока я просто пытаюсь получить кнопку для заполнения жестко кодированных данных);Richfaces 3 динамических столбца datatable

Проблема в том, что в первый раз, когда я нажимаю кнопку, страница обновляется, как ожидалось, и появляется дата, но без столбцов или данных. Если я снова нажму кнопку, все будет выглядеть как обычно.

Может ли кто-нибудь сказать мне, что я делаю неправильно, что мне нужно дважды нажать кнопку?

<a4j:form id="searchForm" style="height: 100%;" ajaxSubmit="false"> 
    ... 
     <h:commandButton value="Search" action="#{tableBacking.search}" /> 
    ... 
     <rich:scrollableDataTable id="resultsTable" value="#{tableBacking.results}" var="results" 
       rows="500" > 
      <rich:column> 
       <f:facet name="header"> 
        <h:outputText value="Row" /> 
       </f:facet> 

       <h:outputText value="#{row}" /> 
      </rich:column> 

      <rich:columns value="#{tableResultsBacking.columns == null ? '' : tableResultsBacking.columns}" var="columns" index="ind" id="column#{ind}" sortBy="#{columns.header}" > 
       <f:facet name="header"> 
        <h:outputText value="#{columns.header}" /> 
       </f:facet> 

       <h:outputText value="#{results[ind].data}" /> 
      </rich:columns> 

     </rich:scrollableDataTable> 
    </a4j:form> 

резервного компонентов-

public class TableLookupBacking { 

    private List<SelectItem> allTables = null; 
    private List<List<Column>> results = null; 

    public TableLookupBacking() throws Exception {} 

    public List<SelectItem> getAllTables() { 

     if(allTables == null) { 
      allTables = new ArrayList<SelectItem>(); 
      DataDao dd = new DataDao(); 
      try { 
       allTables = dd.getTableNames(); 
      } catch (Exception e) { 
       // TODO Add error message here 
       e.printStackTrace(); 
      } 
     } 

     return allTables; 
    } 

    public void search() { 

     DataDao dd = new DataDao(); 
     try { 
      results = dd.getData(); 
     } catch (Exception e) { 
      // TODO Add error message here 
      e.printStackTrace(); 
     } 
     columns = new ArrayList<Column>(); 

     for (List<Column> row : results) { 
      for (Column c : row) { 
       if(columns.size() < row.size()) { 
        columns.add(new Column(c.getHeader())); 
       } 
      } 
     } 

     FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("columns", columns); 
    } 
// getters and setters 
} 

Вот запрос боб так область видимости, что столбцы получить сгенерированные в конструкторе.

public class TableResultsBacking { 

    private List<TableData> columns = null; 

    public TableResultsBacking() throws IOException { 
     if(null != FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("columns")) { 
      columns = (List<TableData>) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("columns"); 
     } 
    } 

    public List<TableData> getColumns() throws Exception { 
     return columns; 
    } 
    public void setColumns(ArrayList<TableData> columns) { 
     this.columns = columns; 
    } 
} 
+0

Я думаю, это должно сработать, если ваш управляемый bean-компонент имеет Session scope или wide. В противном случае вы можете заставить его работать с помощью аннотации RichFaces '@ KeepAlive' в вашем управляемом компоненте, чтобы продлить жизнь управляемого бобины. –

+0

Боб - это сеанс. – Catfish

+0

@ Catfish, если вы предоставляете свои снимки экрана после каждого события, это помогает понять больше. –

ответ

2

Кажется, что страница не загружается правильно после первых двух щелчков. Для каждого поиска требуется 2 клика. По-видимому, после первых двух щелчков мыши данные будут отображаться правильно для следующих кликов, но отобразится только предыдущий номер столбца.

Я закончил тем, что добавил метод, когда при выделении значения выбрано значение, я запрашиваю базу данных и получаю количество столбцов и задаю столбцы. Таким образом, когда страница обновляется, столбцы уже существуют.

1

Вы сказали, что TableResultsBacking является запросом области действий боба, но гнал его в сессии, что означает, что сеанс область действия. Вот почему вы ничего не видите в первый раз. Во втором запросе вы просматриваете столбцы первого запроса, потому что столбцы остались в сеансе. Попробуйте добавить атрибут immediate="true" в команду.

+0

Я не уверен, что вы имеете в виду. TableResultsBacking - это область запроса, а TableLookupBacking - это сеанс. – Catfish

+0

Добавление 'instant =" true "' не делает ничего другого. – Catfish

+0

Извините, мое внимание было уделено атрибуту сеанса «столбцы». Вы должны поддерживать бобы здесь. Как вы можете оказаться на том, что TableResultsBacking будет создан позже? Если он создается первым, чем атрибут сеанса столбцов, он будет равен нулю. Попробуйте поставить точку останова на метод 'search' и конструктор' TableResultsBacking' и посмотреть, с чего это было достигнуто. – partlov

Смежные вопросы