Как связать JSF-компонент со вспомогательным свойством bean-компонента - PullRequest
3 голосов
/ 15 марта 2012

У меня проблема с привязкой p:commandButton к свойству в компоненте. Я попытался упростить мой код, чтобы показать общую идею.

ExampleBean - это поддерживающий боб

public class ExampleBean {

    public String title;        
    List<ExampleWrapper> list;

    // Getters and setters

}

ПримерWrapper - это POJO

public class Wrapper {

    public String name;
    public String description;

    public CommandButton button;

    // Listener which changes button state

    // Getters and setters
}

index.xhtml - главная страница:

<h:form>
    <h:outputText value="Title" />
    <p:inpurText value="#{exampleBean.title}"

    <ui:include src="list.xhtml">
        <ui:param name="bean" value="#{exampleBean}">
    </ui:include>
</h:form>

list.xhtml - это фрагмент, который я хочу использовать в нескольких местах:

<ui:composition ...>
    <ui:repeat id="list" var="exampleWrapper" value="#{bean.list}">
        <h:outputText value="#{exampleWrapper.name}"/>
        <h:outputTextarea value="#{exampleWrapper.description}"/>
        <p:commandButton id="button" binding="#{exampleWrapper.button}" 
            value="Button" />
</ui:composition>

Итак, я получаю исключение: javax.el.

Без атрибута binding все работает и отображается нормально

Не могли бы вы объяснить, почему и как я могу привязать кнопку к этому свойству POJO? Любая помощь будет оценена

Я использую JSF 2.0.2 с Primefaces 3.0.1

1 Ответ

6 голосов
/ 15 марта 2012

Атрибут bindingid) компонента пользовательского интерфейса JSF разрешается во время построения представления. Экземпляр #{exampleWrapper} равен , а не , доступный во время построения представления. Время построения представления - это тот момент, когда файл XHTML анализируется в дереве компонентов JSF. #{exampleWrapper} доступно только во время визуализации представления. Время рендеринга представления - это момент, когда дерево компонентов JSF генерирует вывод HTML.

По сути, в дереве компонентов есть только one <p:commandButton>, который генерирует свой HTML-вывод многократно, сколько итерирует <ui:repeat>. Вместо этого вам нужно привязать его к #{bean} или использовать JSTL <c:forEach> вместо <ui:repeat>. Теги JSTL выполняются именно во время построения представления, и, таким образом, <c:forEach> будет создавать физически несколько компонентов пользовательского интерфейса JSF. Но чаще всего в JSF 2.x не требуется связывать компоненты с компонентами поддержки. Независимо от того, какие функциональные требования вы имели в виду, для которых вы думали, что это решение, оно определенно может быть решено лучше.

...