не начинается действие - НЕТ ИДЕИ? - PullRequest
1 голос
/ 25 мая 2011

Я пытаюсь использовать dataModel вместо привязки dataTable и имею эту проблему. В последнем столбце присутствует команда command, которая должна использоваться для удаления элемента из базы данных. Но когда я нажимаю его, метод Java не запускается.

Часть xhtml (сокращенный код):

<h:form>
<rich:extendedDataTable 
  id="table"
  var="fItem"  
  value="#{myFood.model}" 
  selectionMode="none">

 <rich:column width="150px">
  <f:facet name="header">Datum:</f:facet>
  <h:outputText value="#{fItem.date}"/>
 </rich:column>

 <rich:column>
    <h:commandButton id="save" action="#{myFood.delete}" value="delete"/>
 </rich:column>

 <f:facet name="footer">  
   <h:commandButton id="btnTest" action="#{myFood.test}" value="test"/>
 </f:facet>
</rich:extendedDataTable>
</h:form>

Часть MyFood.java:

public void delete()
{
  System.out.println("TEST");
  try 
  {
    DaoCrud.delete(model.getRowData(), 'P');
  } 
  catch (Exception e) {.....}
}

public void test()
{
  System.out.println("TEST");
}

Но даже "ТЕСТ" не записывается на консоль! Где может быть проблема?

ОБНОВЛЕНИЕ: Я обновил примеры кода (facet & test ()), все работает. Все работает нормально, пока я не попробовал использовать dataModel private DataModel<Item> model; ... Когда я просто перемещаю ту же кнопку Command к фасету, она работает.

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

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

private List<Item> list;
private DataModel<Item> model;

@PostConstruct
public void init() {
    list = itemService.list();
    model = new ListDataModel<Item>(list);
}

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

При сохранении модели впоследующий запрос не совсем тривиален из-за некоторых бизнес-ограничений (например, отсутствующие параметры и т. д.), тогда вам нужно поместить компонент в область просмотра, пометив его @ViewScoped вместо @RequestScoped.Это работает, только если вы используете JSF 2.0.

@ManagedBean
@ViewScoped
public class MyBean {}

В качестве альтернативы, поскольку вы используете RichFaces, вы также можете использовать <a4j:keepAlive> для этого.Поместите это где-нибудь на той же странице, что и форма:

<a4j:keepAlive beanName="#{myBean}" />

Это фактически так же, как @ViewScoped в JSF 2.0.

1 голос
/ 25 мая 2011

Ваш метод delete() должен возвращать объект. Он не будет вызван, если подпись не верна. msgstr "подпись должна соответствовать java.lang.Object action ()". Смотри здесь .

Насколько я помню, вы можете просто вернуть null, если хотите остаться на странице.

public String delete()
{
    System.out.println("TEST");
    try 
    {
       DaoCrud.delete(model.getRowData(), 'P');
    } 
    catch (Exception e) {.....}
    return null;
}

Возможно, вы захотите использовать атрибут actionListener с соответствующим ему методом, если вы не хотите использовать результат метода для навигации. Также подумайте о том, чтобы использовать <a4j:commandButton>, если вы хотите что-то сделать повторно после выполнения actionListener.

1 голос
/ 25 мая 2011

должно быть меньше <h:form>

...