h: commandButton не работает внутри h: dataTable - PullRequest
4 голосов
/ 07 ноября 2011

Я пытаюсь выполнить action - commandButton внутри dataTable, но action не вызывается, когда commandButton помещается внутри таблицы данных, как показано ниже

<h:form>
    <h:dataTable value="#{bean.list}" var="item">
        <h:column>
            <h:commandButton value="submit" action="#{bean.submit}" />
        </h:column>
    </h:dataTable>
</h:form>

Когда я перемещаю commandButton из dataTable, action успешно выполняется.В чем проблема, когда commandButton находится внутри данных?У commandLink такая же проблема.

1 Ответ

14 голосов
/ 07 ноября 2011

Эта проблема может возникать, когда список, стоящий за #{bean.list}, равен , а не , точно так же во время HTTP-запроса на обработку отправки формы, как это было во время запроса на отображение формы. JSF будет повторять список, чтобы найти нажатую кнопку и вызвать ее действие.

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

Лучшее решение - поместить компонент в область видимости и обеспечить правильную загрузку модели данных.

@ManagedBean
@ViewScoped
public class Bean implements Serializable {

    private List<Item> list;

    @EJB
    private ItemService service;

    @PostConstruct
    public void init() {
        list = service.list();
    }

    // ...
}

Смотри также:

...