Добавление компонентов Primefaces динамически - PullRequest
5 голосов
/ 22 ноября 2011

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

<h:form>
    <h:panelGrid columns="2">
        <p:dataGrid id="categoriesGrid" value="#{bean.categories}"
            var="categoryBean" rowIndexVar="rowIndex">
            <p:column>
                <p:selectOneMenu id="categorySelect" effect="drop"
                    value="#{categoryBean.selectedCategory}" >
                    <f:selectItems value="#{categoryBean.availableCategories}"
                        var="category" itemLabel="#{category.name}"
                        itemValue="#{category}" />
                </p:selectOneMenu>
            </p:column>
        </p:dataGrid>
        <p:commandButton actionListener="#{bean.addNewCategory}"
            value="Add category" update="categoriesGrid"/>
    </h:panelGrid>
</h:form>

Но с этим есть проблемаЕсть пример ответа, который я получаю после нажатия кнопки «Добавить категорию»:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<error>
    <error-name>
        class javax.faces.component.UpdateModelException
    </error-name>
    <error-message>
        <![CDATA[/createTutorial.xhtml @85,65 value=
            "#{categoryBean.selectedCategory}":java.util.NoSuchElementException]]>
    </error-message>
</error>
</partial-response>

Заранее спасибо

1 Ответ

2 голосов
/ 23 ноября 2011

Проблема была с моим бобом.Чтобы получить выбранный элемент, мне пришлось реализовать пользовательскую реализацию интерфейса javax.faces.Converter.На мой взгляд, для такой простой задачи достаточно много работы (этот конвертер должен иметь доступ к источнику данных и т. Д.).Итак, я сделал небольшой трюк:

public class CategoryBean{

    private list<Category> availableCategories;
    private Category selectedCategory;

    public Long getCSelectedCategory(){
        // Get selected category by it's id and set selectedCategory
    }

    public void setSelectedCategory(Long selectedCategory){
        return selectedCategory.getId();
    }

    // The remaining setters and getters
}

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

<p:column>
    <p:selectOneMenu id="categorySelect" effect="drop"
        value="#{categoryBean.selectedCategory}" >
        <f:selectItems value="#{categoryBean.availableCategories}"
            var="category" itemLabel="#{category.name}"
            itemValue="#{category.id}" />
    </p:selectOneMenu>
</p:column>

Пожалуйста, обратите внимание на атрибут itemValue иметоды доступа, которые показаны. У меня была неправильная ошибка типа возвращаемого значения.

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

Является ли такой прием хорошим решением по вашему мнению?

...